In [7]:
from IPython.display import Image

Valores missing, outlier y correlaciones¶

Elaborador por: Jacqueline Fernández Ramírez y Jazmín Fernández Ramírez.

Máster Universitario de Ciencia de Datos (MUCD), CUNEF.

En este notebook se realiza el estudio y preprocesamiento de las variables numéricas y categoricas. Se realizarán los siguientes pasos:

  1. Cambio de tipos de variables
  2. Separación en train y test
  3. Análisis de cada variable con gráficos descriptivos
  4. Para variables numericas: matriz de correlación, estudio de outliers y estudio de valores missing
  5. Para variables categoricas: relleno de valores missing, y estudio de correlaciones con vCramer

Para los valores outlier por columnas, se tendrá en cuenta los gráficos:

In [10]:
# <img src="images/analisis_outlier.png">
Image(filename="../images/analisis_outlier.png")
Out[10]:
No description has been provided for this image

Dentro del tratamiento de los valores missing, se eligirá alguno de los siguientes métodos:

In [13]:
Image(filename="../images/missing.png")
Out[13]:
No description has been provided for this image

Importación de librerías¶

In [2]:
import pandas as pd
import numpy as np
import seaborn as sns
from matplotlib import pyplot as plt
import plotly.express as px
from sklearn.impute import KNNImputer
import scipy.stats as ss
import warnings

pd.set_option('display.max_columns', 500)
pd.set_option('display.max_rows', 5000)

Funciones¶

En este trabajo se va a importar las funciones definidas en el archivo funciones_auxiliares.py mediante el prefijo f_aux. Por ejemplo, para llamar a la función plot_feature, se debe usar la sintaxis f_aux.plot_feature(...).

In [5]:
import os
print(os.getcwd())
C:\Users\jacki\OneDrive\Documentos\CUNEF\Aprendizaje_Automatico\practica1_EDA\practica1_EDA\notebooks
In [7]:
import funciones_auxiliares as f_aux

Lectura de datos del preprocesado inicial¶

Lectura de datos y cambio del tipo de variables

In [10]:
df_application = pd.read_csv("./data_preprocessing/bank_data_preprocessed.csv")

df_application.shape
Out[10]:
(307511, 122)
In [12]:
df_application.columns
Out[12]:
Index(['COMMONAREA_MEDI', 'COMMONAREA_AVG', 'COMMONAREA_MODE',
       'NONLIVINGAPARTMENTS_MODE', 'NONLIVINGAPARTMENTS_AVG',
       'NONLIVINGAPARTMENTS_MEDI', 'FONDKAPREMONT_MODE',
       'LIVINGAPARTMENTS_MODE', 'LIVINGAPARTMENTS_AVG',
       'LIVINGAPARTMENTS_MEDI',
       ...
       'DAYS_ID_PUBLISH', 'DAYS_REGISTRATION', 'DAYS_EMPLOYED', 'DAYS_BIRTH',
       'REGION_POPULATION_RELATIVE', 'NAME_HOUSING_TYPE', 'NAME_FAMILY_STATUS',
       'NAME_EDUCATION_TYPE', 'NAME_INCOME_TYPE', 'SK_ID_CURR'],
      dtype='object', length=122)
In [14]:
list_var_cat, other = f_aux.dame_variables_categoricas(dataset=df_application)
df_application[list_var_cat] = df_application[list_var_cat].astype("category")
list_var_continuous = list(df_application.select_dtypes('float').columns)
df_application[list_var_continuous] = df_application[list_var_continuous].astype(float)
df_application.dtypes
Out[14]:
COMMONAREA_MEDI                  float64
COMMONAREA_AVG                   float64
COMMONAREA_MODE                  float64
NONLIVINGAPARTMENTS_MODE         float64
NONLIVINGAPARTMENTS_AVG          float64
NONLIVINGAPARTMENTS_MEDI         float64
FONDKAPREMONT_MODE              category
LIVINGAPARTMENTS_MODE            float64
LIVINGAPARTMENTS_AVG             float64
LIVINGAPARTMENTS_MEDI            float64
FLOORSMIN_AVG                    float64
FLOORSMIN_MODE                   float64
FLOORSMIN_MEDI                   float64
YEARS_BUILD_MEDI                 float64
YEARS_BUILD_MODE                 float64
YEARS_BUILD_AVG                  float64
OWN_CAR_AGE                      float64
LANDAREA_MEDI                    float64
LANDAREA_MODE                    float64
LANDAREA_AVG                     float64
BASEMENTAREA_MEDI                float64
BASEMENTAREA_AVG                 float64
BASEMENTAREA_MODE                float64
EXT_SOURCE_1                     float64
NONLIVINGAREA_MODE               float64
NONLIVINGAREA_AVG                float64
NONLIVINGAREA_MEDI               float64
ELEVATORS_MEDI                   float64
ELEVATORS_AVG                    float64
ELEVATORS_MODE                   float64
WALLSMATERIAL_MODE              category
APARTMENTS_MEDI                  float64
APARTMENTS_AVG                   float64
APARTMENTS_MODE                  float64
ENTRANCES_MEDI                   float64
ENTRANCES_AVG                    float64
ENTRANCES_MODE                   float64
LIVINGAREA_AVG                   float64
LIVINGAREA_MODE                  float64
LIVINGAREA_MEDI                  float64
HOUSETYPE_MODE                  category
FLOORSMAX_MODE                   float64
FLOORSMAX_MEDI                   float64
FLOORSMAX_AVG                    float64
YEARS_BEGINEXPLUATATION_MODE     float64
YEARS_BEGINEXPLUATATION_MEDI     float64
YEARS_BEGINEXPLUATATION_AVG      float64
TOTALAREA_MODE                   float64
EMERGENCYSTATE_MODE             category
OCCUPATION_TYPE                 category
EXT_SOURCE_3                     float64
AMT_REQ_CREDIT_BUREAU_HOUR       float64
AMT_REQ_CREDIT_BUREAU_DAY        float64
AMT_REQ_CREDIT_BUREAU_WEEK       float64
AMT_REQ_CREDIT_BUREAU_MON        float64
AMT_REQ_CREDIT_BUREAU_QRT        float64
AMT_REQ_CREDIT_BUREAU_YEAR       float64
NAME_TYPE_SUITE                 category
OBS_30_CNT_SOCIAL_CIRCLE         float64
DEF_30_CNT_SOCIAL_CIRCLE         float64
OBS_60_CNT_SOCIAL_CIRCLE         float64
DEF_60_CNT_SOCIAL_CIRCLE         float64
EXT_SOURCE_2                     float64
AMT_GOODS_PRICE                  float64
AMT_ANNUITY                      float64
CNT_FAM_MEMBERS                  float64
DAYS_LAST_PHONE_CHANGE           float64
CNT_CHILDREN                    category
FLAG_DOCUMENT_8                 category
NAME_CONTRACT_TYPE              category
CODE_GENDER                     category
FLAG_OWN_CAR                    category
FLAG_DOCUMENT_2                 category
FLAG_DOCUMENT_3                 category
FLAG_DOCUMENT_4                 category
FLAG_DOCUMENT_5                 category
FLAG_DOCUMENT_6                 category
FLAG_DOCUMENT_7                 category
FLAG_DOCUMENT_9                 category
FLAG_DOCUMENT_21                category
FLAG_DOCUMENT_10                category
FLAG_DOCUMENT_11                category
FLAG_OWN_REALTY                 category
FLAG_DOCUMENT_13                category
FLAG_DOCUMENT_14                category
FLAG_DOCUMENT_15                category
FLAG_DOCUMENT_16                category
FLAG_DOCUMENT_17                category
FLAG_DOCUMENT_18                category
FLAG_DOCUMENT_19                category
FLAG_DOCUMENT_20                category
FLAG_DOCUMENT_12                category
AMT_CREDIT                       float64
AMT_INCOME_TOTAL                 float64
FLAG_PHONE                      category
LIVE_CITY_NOT_WORK_CITY         category
REG_CITY_NOT_WORK_CITY          category
TARGET                          category
REG_CITY_NOT_LIVE_CITY          category
LIVE_REGION_NOT_WORK_REGION     category
REG_REGION_NOT_WORK_REGION      category
REG_REGION_NOT_LIVE_REGION      category
HOUR_APPR_PROCESS_START         category
WEEKDAY_APPR_PROCESS_START      category
REGION_RATING_CLIENT_W_CITY     category
REGION_RATING_CLIENT            category
FLAG_EMAIL                      category
FLAG_CONT_MOBILE                category
ORGANIZATION_TYPE               category
FLAG_WORK_PHONE                 category
FLAG_EMP_PHONE                  category
FLAG_MOBIL                      category
DAYS_ID_PUBLISH                    int64
DAYS_REGISTRATION                float64
DAYS_EMPLOYED                      int64
DAYS_BIRTH                         int64
REGION_POPULATION_RELATIVE       float64
NAME_HOUSING_TYPE               category
NAME_FAMILY_STATUS              category
NAME_EDUCATION_TYPE             category
NAME_INCOME_TYPE                category
SK_ID_CURR                         int64
dtype: object
In [16]:
df_application.describe()
Out[16]:
COMMONAREA_MEDI COMMONAREA_AVG COMMONAREA_MODE NONLIVINGAPARTMENTS_MODE NONLIVINGAPARTMENTS_AVG NONLIVINGAPARTMENTS_MEDI LIVINGAPARTMENTS_MODE LIVINGAPARTMENTS_AVG LIVINGAPARTMENTS_MEDI FLOORSMIN_AVG FLOORSMIN_MODE FLOORSMIN_MEDI YEARS_BUILD_MEDI YEARS_BUILD_MODE YEARS_BUILD_AVG OWN_CAR_AGE LANDAREA_MEDI LANDAREA_MODE LANDAREA_AVG BASEMENTAREA_MEDI BASEMENTAREA_AVG BASEMENTAREA_MODE EXT_SOURCE_1 NONLIVINGAREA_MODE NONLIVINGAREA_AVG NONLIVINGAREA_MEDI ELEVATORS_MEDI ELEVATORS_AVG ELEVATORS_MODE APARTMENTS_MEDI APARTMENTS_AVG APARTMENTS_MODE ENTRANCES_MEDI ENTRANCES_AVG ENTRANCES_MODE LIVINGAREA_AVG LIVINGAREA_MODE LIVINGAREA_MEDI FLOORSMAX_MODE FLOORSMAX_MEDI FLOORSMAX_AVG YEARS_BEGINEXPLUATATION_MODE YEARS_BEGINEXPLUATATION_MEDI YEARS_BEGINEXPLUATATION_AVG TOTALAREA_MODE EXT_SOURCE_3 AMT_REQ_CREDIT_BUREAU_HOUR AMT_REQ_CREDIT_BUREAU_DAY AMT_REQ_CREDIT_BUREAU_WEEK AMT_REQ_CREDIT_BUREAU_MON AMT_REQ_CREDIT_BUREAU_QRT AMT_REQ_CREDIT_BUREAU_YEAR OBS_30_CNT_SOCIAL_CIRCLE DEF_30_CNT_SOCIAL_CIRCLE OBS_60_CNT_SOCIAL_CIRCLE DEF_60_CNT_SOCIAL_CIRCLE EXT_SOURCE_2 AMT_GOODS_PRICE AMT_ANNUITY CNT_FAM_MEMBERS DAYS_LAST_PHONE_CHANGE AMT_CREDIT AMT_INCOME_TOTAL DAYS_ID_PUBLISH DAYS_REGISTRATION DAYS_EMPLOYED DAYS_BIRTH REGION_POPULATION_RELATIVE SK_ID_CURR
count 92646.000000 92646.000000 92646.000000 93997.000000 93997.000000 93997.000000 97312.000000 97312.000000 97312.000000 98869.000000 98869.000000 98869.000000 103023.000000 103023.000000 103023.000000 104582.000000 124921.000000 124921.000000 124921.000000 127568.000000 127568.000000 127568.000000 134133.000000 137829.000000 137829.000000 137829.000000 143620.000000 143620.000000 143620.000000 151450.000000 151450.00000 151450.000000 152683.000000 152683.000000 152683.000000 153161.000000 153161.000000 153161.000000 154491.000000 154491.000000 154491.000000 157504.000000 157504.000000 157504.000000 159080.000000 246546.000000 265992.000000 265992.000000 265992.000000 265992.000000 265992.000000 265992.000000 306490.000000 306490.000000 306490.000000 306490.000000 3.068510e+05 3.072330e+05 307499.000000 307509.000000 307510.000000 3.075110e+05 3.075110e+05 307511.000000 307511.000000 307511.000000 307511.000000 307511.000000 307511.000000
mean 0.044595 0.044621 0.042553 0.008076 0.008809 0.008651 0.105645 0.100775 0.101954 0.231894 0.228058 0.231625 0.755746 0.759637 0.752471 12.061091 0.067169 0.064958 0.066333 0.087955 0.088442 0.087543 0.502130 0.027022 0.028358 0.028236 0.078078 0.078942 0.074490 0.117850 0.11744 0.114231 0.149213 0.149725 0.145193 0.107399 0.105975 0.108607 0.222315 0.225897 0.226282 0.977065 0.977752 0.977735 0.102547 0.510853 0.006402 0.007000 0.034362 0.267395 0.265474 1.899974 1.422245 0.143421 1.405292 0.100049 5.143927e-01 5.383962e+05 27108.573909 2.152665 -962.858788 5.990260e+05 1.687979e+05 -2994.202373 -4986.120328 63815.045904 -16036.995067 0.020868 278180.518577
std 0.076144 0.076036 0.074445 0.046276 0.047732 0.047415 0.097880 0.092576 0.093642 0.161380 0.161160 0.161934 0.112066 0.110111 0.113280 11.944812 0.082167 0.081750 0.081184 0.082179 0.082438 0.084307 0.211062 0.070254 0.069523 0.070166 0.134467 0.134576 0.132256 0.109076 0.10824 0.107936 0.100368 0.100049 0.100977 0.110565 0.111845 0.112260 0.143709 0.145067 0.144641 0.064575 0.059897 0.059223 0.107462 0.194844 0.083849 0.110757 0.204685 0.916002 0.794056 1.869295 2.400989 0.446698 2.379803 0.362291 1.910602e-01 3.694465e+05 14493.737315 0.910682 826.808487 4.024908e+05 2.371231e+05 1509.450419 3522.886321 141275.766519 4363.988632 0.013831 102790.175348
min 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.014568 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000527 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 8.173617e-08 4.050000e+04 1615.500000 1.000000 -4292.000000 4.500000e+04 2.565000e+04 -7197.000000 -24672.000000 -17912.000000 -25229.000000 0.000290 100002.000000
25% 0.007900 0.007800 0.007200 0.000000 0.000000 0.000000 0.054200 0.050400 0.051300 0.083300 0.083300 0.083300 0.691400 0.699400 0.687200 5.000000 0.018700 0.016600 0.018700 0.043700 0.044200 0.040700 0.334007 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.058300 0.05770 0.052500 0.069000 0.069000 0.069000 0.045300 0.042700 0.045700 0.166700 0.166700 0.166700 0.976700 0.976700 0.976700 0.041200 0.370650 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 3.924574e-01 2.385000e+05 16524.000000 2.000000 -1570.000000 2.700000e+05 1.125000e+05 -4299.000000 -7479.500000 -2760.000000 -19682.000000 0.010006 189145.500000
50% 0.020800 0.021100 0.019000 0.000000 0.000000 0.000000 0.077100 0.075600 0.076100 0.208300 0.208300 0.208300 0.758500 0.764800 0.755200 9.000000 0.048700 0.045800 0.048100 0.075800 0.076300 0.074600 0.505998 0.001100 0.003600 0.003100 0.000000 0.000000 0.000000 0.086400 0.08760 0.084000 0.137900 0.137900 0.137900 0.074500 0.073100 0.074900 0.166700 0.166700 0.166700 0.981600 0.981600 0.981600 0.068800 0.535276 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 5.659614e-01 4.500000e+05 24903.000000 2.000000 -757.000000 5.135310e+05 1.471500e+05 -3254.000000 -4504.000000 -1213.000000 -15750.000000 0.018850 278202.000000
75% 0.051300 0.051500 0.049000 0.003900 0.003900 0.003900 0.131300 0.121000 0.123100 0.375000 0.375000 0.375000 0.825600 0.823600 0.823200 15.000000 0.086800 0.084100 0.085600 0.111600 0.112200 0.112400 0.675053 0.023100 0.027700 0.026600 0.120000 0.120000 0.120800 0.148900 0.14850 0.143900 0.206900 0.206900 0.206900 0.129900 0.125200 0.130300 0.333300 0.333300 0.333300 0.986600 0.986600 0.986600 0.127600 0.669057 0.000000 0.000000 0.000000 0.000000 0.000000 3.000000 2.000000 0.000000 2.000000 0.000000 6.636171e-01 6.795000e+05 34596.000000 3.000000 -274.000000 8.086500e+05 2.025000e+05 -1720.000000 -2010.000000 -289.000000 -12413.000000 0.028663 367142.500000
max 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 91.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 0.962693 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.00000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 0.896010 4.000000 9.000000 8.000000 27.000000 261.000000 25.000000 348.000000 34.000000 344.000000 24.000000 8.549997e-01 4.050000e+06 258025.500000 20.000000 0.000000 4.050000e+06 1.170000e+08 0.000000 0.000000 365243.000000 -7489.000000 0.072508 456255.000000

Separación en train y test estratificado¶

In [19]:
pd_plot_target_status = df_application['TARGET']\
        .value_counts(normalize=True)\
        .mul(100).rename('percent').reset_index()

pd_plot_target_status_conteo = df_application['TARGET'].value_counts().reset_index()
pd_plot_target_status_pc = pd.merge(pd_plot_target_status, 
                                  pd_plot_target_status_conteo, on=['index'], how='inner')

fig = px.histogram(pd_plot_target_status_pc, x="index", y=['percent'])
fig.show()
In [21]:
from sklearn.model_selection import train_test_split
X_df_application, X_df_application_test, y_df_application, y_df_application_test = train_test_split(df_application.drop('TARGET',axis=1), 
                                                                     df_application['TARGET'], 
                                                                     stratify=df_application['TARGET'], 
                                                                     test_size=0.2)
df_application_train = pd.concat([X_df_application, y_df_application],axis=1)
df_application_test = pd.concat([X_df_application_test, y_df_application_test],axis=1)
In [23]:
print('== Train\n', df_application_train['TARGET'].value_counts(normalize=True))
print('== Test\n', df_application_test['TARGET'].value_counts(normalize=True))
== Train
 0    0.919271
1    0.080729
Name: TARGET, dtype: float64
== Test
 0    0.919272
1    0.080728
Name: TARGET, dtype: float64

En el presente código, se llevó a cabo un estudio minucioso de la variable objetivo TARGET para entender su distribución y tratar el desequilibrio notable existente. En un principio, se determinó la distribución porcentual y la totalidad de cada clase de TARGET en el DataFrame df_application. Esto hizo evidente que el 91.93% de los registros son de la clase 0 y únicamente el 8.07% pertenecen a la clase 1. Se aplicó una separación estratificada para preservar la proporción de clases en los conjuntos de datos de entrenamiento y prueba. De este modo, se empleó la función train_test_split de sklearn, garantizando una representación justa de ambas clases en los datos de entrenamiento y prueba.

Por otro lado, para confirmar la estratificación, se comprobaron las proporciones de cada clase en los dos grupos. Los hallazgos corroboraron que las distribuciones de TARGET se conservaron constantes tanto en los datos de entrenamiento como en los de prueba, lo cual es vital para prevenir prejuicios en el modelo y asegurar una valoración equitativa. Este cuidadoso enfoque en la separación y validación de los datos es esencial para garantizar la robustez y exactitud de los modelos de aprendizaje automático que se formarán en dichos datos. Por lo tanto, se asegura que el modelo pueda generalizar adecuadamente nuevos datos y ofrecer proyecciones confiables.

Visualización descriptiva de los datos¶

Veo el número de valores nulos por filas y por columnas

In [41]:
pd_series_null_columns = df_application_train.isnull().sum().sort_values(ascending=False)
pd_series_null_rows = df_application_train.isnull().sum(axis=1).sort_values(ascending=False)
print(pd_series_null_columns.shape, pd_series_null_rows.shape)

pd_null_columnas = pd.DataFrame(pd_series_null_columns, columns=['nulos_columnas'])     
pd_null_filas = pd.DataFrame(pd_series_null_rows, columns=['nulos_filas'])  
pd_null_filas['target'] = df_application['TARGET'].copy()
pd_null_columnas['porcentaje_columnas'] = pd_null_columnas['nulos_columnas']/df_application_train.shape[0]
pd_null_filas['porcentaje_filas']= pd_null_filas['nulos_filas']/df_application_train.shape[1]
(122,) (246008,)
In [140]:
pd_null_columnas
Out[140]:
nulos_columnas porcentaje_columnas
COMMONAREA_MEDI 171807 0.698380
COMMONAREA_MODE 171807 0.698380
COMMONAREA_AVG 171807 0.698380
NONLIVINGAPARTMENTS_MODE 170790 0.694246
NONLIVINGAPARTMENTS_MEDI 170790 0.694246
NONLIVINGAPARTMENTS_AVG 170790 0.694246
FONDKAPREMONT_MODE 168105 0.683331
LIVINGAPARTMENTS_AVG 168087 0.683258
LIVINGAPARTMENTS_MEDI 168087 0.683258
LIVINGAPARTMENTS_MODE 168087 0.683258
FLOORSMIN_AVG 166825 0.678128
FLOORSMIN_MODE 166825 0.678128
FLOORSMIN_MEDI 166825 0.678128
YEARS_BUILD_MODE 163534 0.664751
YEARS_BUILD_AVG 163534 0.664751
YEARS_BUILD_MEDI 163534 0.664751
OWN_CAR_AGE 162385 0.660080
LANDAREA_MODE 145926 0.593176
LANDAREA_AVG 145926 0.593176
LANDAREA_MEDI 145926 0.593176
BASEMENTAREA_MEDI 143829 0.584652
BASEMENTAREA_AVG 143829 0.584652
BASEMENTAREA_MODE 143829 0.584652
EXT_SOURCE_1 138768 0.564079
NONLIVINGAREA_MODE 135623 0.551295
NONLIVINGAREA_AVG 135623 0.551295
NONLIVINGAREA_MEDI 135623 0.551295
ELEVATORS_AVG 130988 0.532454
ELEVATORS_MODE 130988 0.532454
ELEVATORS_MEDI 130988 0.532454
WALLSMATERIAL_MODE 124941 0.507874
APARTMENTS_MEDI 124761 0.507142
APARTMENTS_AVG 124761 0.507142
APARTMENTS_MODE 124761 0.507142
ENTRANCES_MEDI 123732 0.502959
ENTRANCES_AVG 123732 0.502959
ENTRANCES_MODE 123732 0.502959
LIVINGAREA_AVG 123365 0.501467
LIVINGAREA_MODE 123365 0.501467
LIVINGAREA_MEDI 123365 0.501467
HOUSETYPE_MODE 123312 0.501252
FLOORSMAX_MODE 122323 0.497232
FLOORSMAX_MEDI 122323 0.497232
FLOORSMAX_AVG 122323 0.497232
YEARS_BEGINEXPLUATATION_AVG 119906 0.487407
YEARS_BEGINEXPLUATATION_MODE 119906 0.487407
YEARS_BEGINEXPLUATATION_MEDI 119906 0.487407
TOTALAREA_MODE 118657 0.482330
EMERGENCYSTATE_MODE 116520 0.473643
OCCUPATION_TYPE 77090 0.313364
EXT_SOURCE_3 48722 0.198050
AMT_REQ_CREDIT_BUREAU_HOUR 33156 0.134776
AMT_REQ_CREDIT_BUREAU_DAY 33156 0.134776
AMT_REQ_CREDIT_BUREAU_WEEK 33156 0.134776
AMT_REQ_CREDIT_BUREAU_MON 33156 0.134776
AMT_REQ_CREDIT_BUREAU_QRT 33156 0.134776
AMT_REQ_CREDIT_BUREAU_YEAR 33156 0.134776
NAME_TYPE_SUITE 1044 0.004244
OBS_60_CNT_SOCIAL_CIRCLE 792 0.003219
DEF_60_CNT_SOCIAL_CIRCLE 792 0.003219
DEF_30_CNT_SOCIAL_CIRCLE 792 0.003219
OBS_30_CNT_SOCIAL_CIRCLE 792 0.003219
EXT_SOURCE_2 509 0.002069
AMT_GOODS_PRICE 234 0.000951
AMT_ANNUITY 9 0.000037
CNT_FAM_MEMBERS 2 0.000008
DAYS_LAST_PHONE_CHANGE 1 0.000004
HOUR_APPR_PROCESS_START 0 0.000000
FLAG_EMAIL 0 0.000000
REGION_RATING_CLIENT 0 0.000000
REGION_RATING_CLIENT_W_CITY 0 0.000000
WEEKDAY_APPR_PROCESS_START 0 0.000000
REG_CITY_NOT_LIVE_CITY 0 0.000000
REG_REGION_NOT_LIVE_REGION 0 0.000000
REG_REGION_NOT_WORK_REGION 0 0.000000
LIVE_REGION_NOT_WORK_REGION 0 0.000000
ORGANIZATION_TYPE 0 0.000000
REG_CITY_NOT_WORK_CITY 0 0.000000
FLAG_CONT_MOBILE 0 0.000000
FLAG_MOBIL 0 0.000000
FLAG_WORK_PHONE 0 0.000000
FLAG_EMP_PHONE 0 0.000000
FLAG_PHONE 0 0.000000
DAYS_ID_PUBLISH 0 0.000000
DAYS_REGISTRATION 0 0.000000
DAYS_EMPLOYED 0 0.000000
DAYS_BIRTH 0 0.000000
REGION_POPULATION_RELATIVE 0 0.000000
NAME_HOUSING_TYPE 0 0.000000
NAME_FAMILY_STATUS 0 0.000000
NAME_EDUCATION_TYPE 0 0.000000
NAME_INCOME_TYPE 0 0.000000
SK_ID_CURR 0 0.000000
LIVE_CITY_NOT_WORK_CITY 0 0.000000
FLAG_DOCUMENT_12 0 0.000000
AMT_INCOME_TOTAL 0 0.000000
FLAG_DOCUMENT_9 0 0.000000
CNT_CHILDREN 0 0.000000
FLAG_DOCUMENT_8 0 0.000000
NAME_CONTRACT_TYPE 0 0.000000
CODE_GENDER 0 0.000000
FLAG_OWN_CAR 0 0.000000
FLAG_DOCUMENT_2 0 0.000000
FLAG_DOCUMENT_3 0 0.000000
FLAG_DOCUMENT_4 0 0.000000
FLAG_DOCUMENT_5 0 0.000000
FLAG_DOCUMENT_6 0 0.000000
FLAG_DOCUMENT_7 0 0.000000
FLAG_DOCUMENT_21 0 0.000000
AMT_CREDIT 0 0.000000
FLAG_DOCUMENT_10 0 0.000000
FLAG_DOCUMENT_11 0 0.000000
FLAG_OWN_REALTY 0 0.000000
FLAG_DOCUMENT_13 0 0.000000
FLAG_DOCUMENT_14 0 0.000000
FLAG_DOCUMENT_15 0 0.000000
FLAG_DOCUMENT_16 0 0.000000
FLAG_DOCUMENT_17 0 0.000000
FLAG_DOCUMENT_18 0 0.000000
FLAG_DOCUMENT_19 0 0.000000
FLAG_DOCUMENT_20 0 0.000000
TARGET 0 0.000000
In [142]:
pd_null_filas.head()
Out[142]:
nulos_filas target porcentaje_filas
69707 61 0 0.5
269492 61 0 0.5
150206 61 0 0.5
116937 61 0 0.5
244833 61 0 0.5

En este apartado, pd_series_null_columns y pd_series_null_rows, determinan la cantidad total de valores nulos en cada columna y fila, respectivamente, y las organizan de manera descendente para detectar con eficacia las columnas y filas con mayor cantidad de valores nulos. Cabe mencionar que, detectar la ubicación de los valores nulos es esencial para el siguiente paso en la gestión de datos, debido a que facilita la toma de decisiones fundamentadas respecto a si se deben modificar filas/columnas, atribuir valores nulos o tratar los nulos de una forma distinta.

Distribución del resto de variables¶

In [2]:
import matplotlib.pyplot as plt
import seaborn as sns
import time
import gc
import psutil
import numpy as np

def set_plot_style():
    """Configura el estilo general de los gráficos"""
    sns.set_style("whitegrid")
    plt.rcParams['figure.dpi'] = 100
    plt.rcParams['font.size'] = 10
    plt.rcParams['axes.titlesize'] = 12
    plt.rcParams['axes.labelsize'] = 10
    plt.rcParams['xtick.labelsize'] = 9
    plt.rcParams['ytick.labelsize'] = 9

def clear_memory():
    """Limpia la memoria"""
    plt.close('all')
    gc.collect()

def optimize_figure_size(n_categories, label_length):
    """Optimiza el tamaño de la figura"""
    if n_categories > 10 or label_length > 15:
        return (15, 6)
    return (12, 5)

def plot_feature(df, col_name, isContinuous, target, max_categories=15, sample_size=50000):
    """
    Función para crear gráficos exploratorios personalizados con Seaborn, optimizando su diseño según las 
    características de la variable analizada (continua o categórica) y su relación con la variable objetivo.

    Parámetros:
    -----------
    - df : pandas.DataFrame
        El conjunto de datos que contiene las variables a analizar.
    - col_name : str
        Nombre de la columna a analizar dentro del DataFrame.
    - isContinuous : bool
        Indica si la columna es una variable continua (`True`) o categórica (`False`).
    - target : str
        Nombre de la variable objetivo con la que se analizará la relación de la columna.
    - max_categories : int, opcional (default=15)
        Número máximo de categorías a visualizar para variables categóricas (las categorías con menor frecuencia serán excluidas si se excede este límite).
    - sample_size : int, opcional (default=50000)
        Tamaño máximo de la muestra a utilizar para optimizar el rendimiento en conjuntos de datos grandes.

    Salida:
    -------
    - fig : matplotlib.figure.Figure
        Figura generada con los gráficos. Si ocurre un error durante la generación de los gráficos, 
        se devuelve `None`.

    Descripción del Proceso:
    ------------------------
    1. **Reducción de datos para conjuntos grandes**: Si el número de filas del DataFrame supera 
       `sample_size`, se toma una muestra aleatoria para optimizar la velocidad de procesamiento.
    2. **Ajuste del tamaño de la figura**: El tamaño de los gráficos se calcula dinámicamente en función 
       del número de valores únicos en la columna analizada (`col_name`) y la longitud de sus etiquetas.
    3. **Gráficos para variables continuas**:
       - **Histograma**: Muestra la distribución de la variable. Incluye líneas para la media y la mediana.
       - **Boxplot**: Visualiza la distribución de la variable por categorías de la variable objetivo.
    4. **Gráficos para variables categóricas**:
       - **Conteo de categorías**: Muestra la frecuencia de las principales categorías.
       - **Proporción por target**: Visualiza la proporción de la variable objetivo en función de las categorías.
    5. **Limpieza de outliers (para continuas)**: Se excluyen valores extremos utilizando los percentiles 
       1 y 99.
    6. **Control de etiquetas y rotación**: Se optimizan las etiquetas del eje X para mejorar la legibilidad, 
       ajustando la rotación según la longitud de las etiquetas y el número de categorías.

    Uso recomendado:
    -----------------
    Utiliza esta función para el análisis exploratorio de datos (EDA), cuando necesites entender:
    - La distribución de una variable continua o categórica.
    - La relación entre una variable independiente y la variable objetivo.
    
    Manejo de errores:
    ------------------
    Si ocurre un error durante la ejecución (por ejemplo, si una columna no existe en el DataFrame o si 
    el tipo de dato no es adecuado), la función cierra la figura creada y devuelve `None`.   
    """
    # Muestreo si el dataset es grande
    if len(df) > sample_size:
        df = df.sample(n=sample_size, random_state=42)
    
    # Calcular métricas para el tamaño
    n_unique = len(df[col_name].unique())
    max_label_len = df[col_name].astype(str).str.len().max()
    figsize = optimize_figure_size(n_unique, max_label_len)
    
    # Crear figura
    fig, (ax1, ax2) = plt.subplots(1, 2, figsize=figsize)
    
    # Paleta de colores personalizada
    palette = sns.color_palette(['#2ecc71', '#e74c3c', '#3498db'])
    
    try:
        # Calcular información de nulos
        nulls = df[col_name].isnull().sum()
        null_pct = (nulls / len(df)) * 100
        
        if isContinuous:
            # Limpiar outliers
            q1, q3 = df[col_name].quantile([0.01, 0.99])
            df_clean = df[(df[col_name] >= q1) & (df[col_name] <= q3)]
            
            # Gráfico de distribución
            sns.histplot(
                data=df_clean,
                x=col_name,
                ax=ax1,
                color=palette[0],
                kde=True,
                bins=30
            )
            
            # Añadir líneas de media y mediana
            mean_val = df_clean[col_name].mean()
            median_val = df_clean[col_name].median()
            ax1.axvline(mean_val, color=palette[1], linestyle='--', label=f'Media: {mean_val:.2f}')
            ax1.axvline(median_val, color=palette[2], linestyle='--', label=f'Mediana: {median_val:.2f}')
            ax1.legend(fontsize=8)
            
            # Boxplot
            sns.boxplot(
                x=target,
                y=col_name,
                data=df_clean,
                ax=ax2,
                palette=[palette[0], palette[1]]
            )
            
        else:
            # Limitar categorías para variables categóricas
            value_counts = df[col_name].value_counts()
            if len(value_counts) > max_categories:
                top_cats = value_counts.nlargest(max_categories).index
                df = df[df[col_name].isin(top_cats)]
                value_counts = value_counts[top_cats]
                
            # Gráfico de conteo
            sns.countplot(
                data=df,
                x=col_name,
                order=value_counts.index,
                ax=ax1,
                color=palette[0]
            )
            
            # Gráfico de proporción por target
            target_props = df.groupby(col_name)[target].value_counts(normalize=True).unstack()
            target_props.plot(
                kind='bar',
                ax=ax2,
                color=[palette[0], palette[1]],
                width=0.8
            )
            ax2.set_ylabel(f'Proporción de {target}')
        
        # Configurar títulos y etiquetas
        ax1.set_title(f'Distribución de {col_name}\nNulos: {nulls:,} ({null_pct:.1f}%)')
        ax2.set_title(f'Relación con {target}')
        
        # Ajustar etiquetas
        for ax in [ax1, ax2]:
            if not isContinuous:
                labels = ax.get_xticklabels()
                if len(labels) > 0:
                    max_len = max(len(str(l.get_text())) for l in labels)
                    rotation = 90 if max_len > 10 or len(labels) > 5 else 45
                    ax.set_xticklabels(
                        labels, 
                        rotation=rotation, 
                        ha='right' if rotation == 90 else 'right',
                        fontsize=8
                    )
            
            # Ajustar grid
            ax.grid(True, alpha=0.3)
            
            # Ajustar límites
            if not isContinuous:
                ax.set_xlabel(col_name, fontsize=9)
        
        # Ajustar espacio
        plt.tight_layout()
        return fig
        
    except Exception as e:
        plt.close(fig)
        print(f"Error en {col_name}: {str(e)}")
        return None

def plot_all_features(df, target_col='TARGET', batch_size=3, memory_threshold=85):
    """
    Función para generar gráficos exploratorios de todas las características de un conjunto de datos,
    optimizando el uso de recursos de memoria y procesando las columnas en lotes.

    Parámetros:
    -----------
    - df : pandas.DataFrame
        El conjunto de datos que contiene las características y la variable objetivo.
    - target_col : str, opcional (default='TARGET')
        Nombre de la columna objetivo con la cual se analizará la relación de las demás características.
    - batch_size : int, opcional (default=3)
        Número de columnas a procesar simultáneamente en cada lote para optimizar el rendimiento.
    - memory_threshold : int, opcional (default=85)
        Porcentaje máximo de uso de memoria permitido antes de forzar la limpieza de recursos.

    Descripción del Proceso:
    ------------------------
    1. **Configuración inicial**:
       - Configura el estilo visual para los gráficos utilizando una función personalizada (`set_plot_style`).
       - Excluye la columna objetivo (`target_col`) de la lista de columnas a procesar.
       - Calcula el número total de columnas a analizar.

    2. **Procesamiento por lotes**:
       - Divide las columnas en lotes (`batch_size`) para evitar sobrecargar la memoria en datasets grandes.
       - Antes de procesar un lote, verifica el uso de memoria utilizando `psutil.virtual_memory()`.
       - Si el uso de memoria excede el umbral definido (`memory_threshold`), fuerza la limpieza de memoria 
         invocando `clear_memory()`.

    3. **Generación de gráficos**:
       - Para cada columna del lote:
         - Determina si es una variable continua o categórica, basándose en su tipo de datos y el número de 
           valores únicos.
         - Llama a la función `plot_feature` para generar los gráficos correspondientes. Si la función devuelve 
           un gráfico válido, este se muestra y se cierra para liberar recursos.
       - Limpia la memoria después de procesar cada columna para optimizar el uso de recursos.

    4. **Pausa entre lotes**:
       - Introduce un breve retraso entre lotes para evitar sobrecargar el sistema, especialmente útil en entornos 
         con recursos limitados.

    5. **Manejo de errores**:
       - Captura excepciones generadas por columnas individuales y continúa procesando las demás, 
         asegurando que el proceso no se detenga por errores aislados.
       - Permite la interrupción manual mediante un `KeyboardInterrupt` (Ctrl + C), asegurando la limpieza de 
         recursos antes de finalizar.

    Salida:
    -------
    - Muestra en pantalla los gráficos generados para cada columna y los cierra automáticamente para optimizar 
      el uso de memoria.
    - Imprime mensajes en la consola para informar sobre el progreso del análisis (lotes procesados, columnas 
      con errores, etc.).

    Uso recomendado:
    -----------------
    Esta función es ideal para realizar análisis exploratorio de datos (EDA) cuando:
    - Trabajas con un conjunto de datos con un gran número de características.
    - Necesitas automatizar la generación de gráficos para todas las columnas, optimizando el uso de recursos.
    - Quieres identificar patrones generales en la relación entre las características y la variable objetivo.

    Manejo de errores:
    ------------------
    - Si una columna no puede procesarse por cualquier motivo (como valores no válidos o errores inesperados), 
      la función imprime el error en consola y continúa con la siguiente columna.
    - Permite interrumpir el proceso manualmente mediante Ctrl + C, asegurando la limpieza de memoria al finalizar.
    """
    # Configurar estilo
    set_plot_style()
    
    # Preparar columnas
    columns = [col for col in df.columns if col != target_col]
    total_cols = len(columns)
    
    print(f"Iniciando análisis de {total_cols} características")
    
    try:
        for i in range(0, total_cols, batch_size):
            # Verificar memoria
            if psutil.virtual_memory().percent > memory_threshold:
                clear_memory()
                print("\nLimpiando memoria...")
                time.sleep(2)
            
            batch_cols = columns[i:i + batch_size]
            print(f"\nProcesando lote {i//batch_size + 1} de {(total_cols + batch_size - 1)//batch_size}")
            
            for col in batch_cols:
                try:
                    # Determinar tipo de variable
                    is_continuous = (
                        df[col].dtype in [float, int] and 
                        len(df[col].unique()) > 10
                    )
                    
                    # Crear gráfico
                    fig = plot_feature(
                        df=df,
                        col_name=col,
                        isContinuous=is_continuous,
                        target=target_col,
                        max_categories=15,    # Límite de categorías
                        sample_size=50000     # Límite de registros
                    )
                    
                    if fig is not None:
                        plt.show()
                        plt.close(fig)
                    
                    # Limpiar memoria
                    clear_memory()
                    
                except Exception as e:
                    print(f"Error procesando {col}: {str(e)}")
                    continue
            
            # Pausa entre lotes
            time.sleep(1)
        
        print("\nProceso completado exitosamente.")
        
    except KeyboardInterrupt:
        print("\nProceso interrumpido por el usuario.")
        clear_memory()
    
    finally:
        clear_memory()
In [31]:
# Ejecutar la visualización
plot_all_features(
    df=df_application_train,
    target_col='TARGET',
    batch_size=3,           # 3 gráficos por lote
    memory_threshold=85     # Limpiar memoria al 85%
)
Iniciando análisis de 121 características

Limpiando memoria...

Procesando lote 1 de 41
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Limpiando memoria...

Procesando lote 2 de 41
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Limpiando memoria...

Procesando lote 3 de 41
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Limpiando memoria...

Procesando lote 4 de 41
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Limpiando memoria...

Procesando lote 5 de 41
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Limpiando memoria...

Procesando lote 6 de 41
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Limpiando memoria...

Procesando lote 7 de 41
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Limpiando memoria...

Procesando lote 8 de 41
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Limpiando memoria...

Procesando lote 9 de 41
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Limpiando memoria...

Procesando lote 10 de 41
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Limpiando memoria...

Procesando lote 11 de 41
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Limpiando memoria...

Procesando lote 12 de 41
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Limpiando memoria...

Procesando lote 13 de 41
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Limpiando memoria...

Procesando lote 14 de 41
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Limpiando memoria...

Procesando lote 15 de 41
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Limpiando memoria...

Procesando lote 16 de 41
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Limpiando memoria...

Procesando lote 17 de 41
No description has been provided for this image
Error en OCCUPATION_TYPE: operands could not be broadcast together with shape (18,) (15,)
No description has been provided for this image
Limpiando memoria...

Procesando lote 18 de 41
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Limpiando memoria...

Procesando lote 19 de 41
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Limpiando memoria...

Procesando lote 20 de 41
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Limpiando memoria...

Procesando lote 21 de 41
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Limpiando memoria...

Procesando lote 22 de 41
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Limpiando memoria...

Procesando lote 23 de 41
No description has been provided for this image
Error en CNT_CHILDREN: operands could not be broadcast together with shape (15,) (9,)
No description has been provided for this image
Limpiando memoria...

Procesando lote 24 de 41
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Limpiando memoria...

Procesando lote 25 de 41
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Limpiando memoria...

Procesando lote 26 de 41
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Limpiando memoria...

Procesando lote 27 de 41
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Limpiando memoria...

Procesando lote 28 de 41
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Limpiando memoria...

Procesando lote 29 de 41
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Limpiando memoria...

Procesando lote 30 de 41
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Limpiando memoria...

Procesando lote 31 de 41
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Limpiando memoria...

Procesando lote 32 de 41
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Limpiando memoria...

Procesando lote 33 de 41
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Limpiando memoria...

Procesando lote 34 de 41
No description has been provided for this image
No description has been provided for this image
Error en HOUR_APPR_PROCESS_START: operands could not be broadcast together with shape (24,) (15,)

Limpiando memoria...

Procesando lote 35 de 41
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Limpiando memoria...

Procesando lote 36 de 41
No description has been provided for this image
No description has been provided for this image
Error en ORGANIZATION_TYPE: operands could not be broadcast together with shape (58,) (15,)

Limpiando memoria...

Procesando lote 37 de 41
No description has been provided for this image
No description has been provided for this image
Error en FLAG_MOBIL: Length of passed values is 2, index implies 4.

Limpiando memoria...

Procesando lote 38 de 41
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Limpiando memoria...

Procesando lote 39 de 41
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Limpiando memoria...

Procesando lote 40 de 41
Error en NAME_FAMILY_STATUS: operands could not be broadcast together with shape (6,) (5,)
No description has been provided for this image
Error en NAME_INCOME_TYPE: operands could not be broadcast together with shape (8,) (6,)

Limpiando memoria...

Procesando lote 41 de 41
No description has been provided for this image
Proceso completado exitosamente.

Análisis de los gráficos¶

El código establece el estilo de los gráficos y maximiza la utilización de la memoria al generar visualizaciones para cada elemento del dataset df_application_train. La función plot_feature produce gráficos concretos basados en la categoría de variable (continua o categórica) y proporciona una perspectiva minuciosa de la distribución de cada característica y su vínculo con la variable meta (TARGET). Esto comprende diagramas de distribución y boxplots para variables continuas, al igual que diagramas de conteo y proporciones para variables categóricas. Mediante el uso de una gama de colores a medida y la modificación automática del tamaño de las figuras, se garantiza que las visualizaciones sean nítidas y entendibles.

La función principal plot_all_features gestiona el análisis por lotes, facilitando el procesamiento y visualización de grandes datasets sin saturar la memoria del sistema. Este método, mediante la comprobación del uso de memoria y la limpieza periódica de los recursos, garantiza que el análisis sea eficaz y sostenible. Adicionalmente, la selección de grandes datasets incrementa la rapidez y el desempeño del análisis sin comprometer la representatividad de los datos.

Por último, se recalca que a partir de estos gráficos se puede analizar las distribuciones de las variables y su relación con la variable objetivo "TARGET". Entre los principales resultados se encuentra:

  • EXT_SOURCE_1: El gráfico de la variable EXT_SOURCE_1 revela que presenta una distribución bastante equilibrada con una leve tendencia hacia el valor medio. Además, los clientes con valores superiores en EXT_SOURCE_1 tienen una probabilidad menor de incurrir en el TARGET, es decir que los clientes con valores superiores en EXT_SOURCE_1 suelen tener un riesgo asociado más bajo, lo que indica que esta variable podría ser un indicador significativo para medir la probabilidad de cumplimiento de pagos.

  • NAME_CONTRACT_TYPE: La gráfica de la variable NAME_CONTRACT_TYPE muestra que los "Cash loans" (préstamos en efectivo) son significativamente más comunes que los "Revolving loans" (créditos renovables). Los "Cash loans" son préstamos otorgados en una suma fija que los clientes deben devolver en cuotas preestablecidas, mientras que los "Revolving loans" permiten a los clientes retirar fondos hasta un límite acordado y pagar en función del monto utilizado. A partir de esto, de acuerdo con la variable objetivo se comprueba que es más usual tener un retraso en el pago del préstamo en "cash loans", lo cual se puede deber a que estos préstamos suelen ser por montos más grandes y específicos, lo que puede representar una carga financiera más significativa para el prestatario. Por su parte, en los "revolving loans", el prestatario solo está obligado a pagar un mínimo cada mes, lo que puede incentivar un pago más regular, aunque sea pequeño.

  • NAME_EDUCATION_TYPE: Los datos indican que los individuos con grados de educación superior tienen menos tendencia a postergar los pagos de los préstamos. Primero, en los pagos aplazados (1 en rojo), se nota una reducción considerable en la proporción de los pagos aplazados conforme se eleva el nivel de educación. Por ejemplo, los individuos con educación superior y grado académico presentan una proporción significativamente inferior de pagos demorados en comparación con los que poseen "Secondary / secondary especial" o "Lower secondary". En contraste, en los pagos sin demora (0 en verde), la proporción de pagos sin demora se incrementa con grados educativos superiores, lo que indica una correlación positiva entre el pago y la formación académica.

  • DAYS_EMPLOYED: El gráfico de la variable DAYS_EMPLOYED indica que conforme se incrementa la cantidad de días empleados, la proporción de clientes con TARGET equivalente a 0 también se incrementa de manera notable. Esto es comprensible ya que los individuos que han estado trabajando durante un periodo prolongado suelen poseer una mayor estabilidad económica y un ingreso constante, lo que disminuye la probabilidad de incumplimiento de pagos. Además, las capacidades y experiencia obtenidas durante un trabajo extendido pueden convertirse en mejores oportunidades de empleo y una mayor habilidad para gestionar deudas.

  • AMT_CREDIT: La gráfica de la variable AMT_CREDIT indica que las cantidades de crédito generalmente se encuentran en un rango de bajo a medio, con picos en determinados intervalos que representan los valores más habituales. Los clientes que no enfrentan dificultades de pago (TARGET=0) suelen poseer créditos más elevados y repartidos en una gama más extensa en contraste con los que tienen dificultades de pago (TARGET=1). Esto indica que los clientes con créditos más elevados, probablemente debido a condiciones financieras más favorables, tienen menos posibilidad de no cumplir con sus obligaciones de pago.

  • AMT_INCOME_TOTAL: El gráfico de la variable AMT_INCOME_TOTAL indica que la mayor parte de los ingresos totales de las personas se sitúan en un intervalo de bajo a medio. El promedio de los ingresos se sitúa cerca de 185,838.27, mientras que la mediana es de 144,000. Esto señala que existen algunas personas con ingresos considerablemente elevados que superan el promedio. En relación con la variable TARGET, el diagrama de caja (boxplot) muestra que las personas sin dificultades de pago (TARGET=0) suelen tener ingresos más elevados y repartidos en un espectro más extenso en contraste con las que tienen dificultades de pago (TARGET=1). Esto indica que los clientes con ingresos superiores tienen una probabilidad reducida de incumplir con sus pagos, posiblemente debido a una mayor estabilidad económica.

  • NAME_HOUSING_TYPE: A partir del gráfico, se analiza que la variable NAME_HOUSING_TYPE exhibe la distribución de los diferentes tipos de vivienda y su vínculo con la variable TARGET. El diagrama a la izquierda muestra que "House / apartment" es la categoría de vivienda más habitual, con más de 40,000 casos, seguida por "With parents" y otras categorías menos comunes como "Municipal apartment" y "Rented apartment". El gráfico de la derecha resalta que los dos grupos con las proporciones más elevadas de clientes con dificultades de pago (TARGET=1) son "Apartamento alquilado" y "Con padres", lo que indica que residir en apartamentos alquilados o con padres podría estar vinculado a una mayor posibilidad de incumplimiento de pagos, probablemente debido a una estabilidad financiera inferior a la de aquellos que poseen o alquilan viviendas de otro tipo.

Tratamiento de variables continuas¶

A continuación, se tratan los valores missing, las correlaciones de las variables continuas y los outlier

In [35]:
list_var_continuous
Out[35]:
['COMMONAREA_MEDI',
 'COMMONAREA_AVG',
 'COMMONAREA_MODE',
 'NONLIVINGAPARTMENTS_MODE',
 'NONLIVINGAPARTMENTS_AVG',
 'NONLIVINGAPARTMENTS_MEDI',
 'LIVINGAPARTMENTS_MODE',
 'LIVINGAPARTMENTS_AVG',
 'LIVINGAPARTMENTS_MEDI',
 'FLOORSMIN_AVG',
 'FLOORSMIN_MODE',
 'FLOORSMIN_MEDI',
 'YEARS_BUILD_MEDI',
 'YEARS_BUILD_MODE',
 'YEARS_BUILD_AVG',
 'OWN_CAR_AGE',
 'LANDAREA_MEDI',
 'LANDAREA_MODE',
 'LANDAREA_AVG',
 'BASEMENTAREA_MEDI',
 'BASEMENTAREA_AVG',
 'BASEMENTAREA_MODE',
 'EXT_SOURCE_1',
 'NONLIVINGAREA_MODE',
 'NONLIVINGAREA_AVG',
 'NONLIVINGAREA_MEDI',
 'ELEVATORS_MEDI',
 'ELEVATORS_AVG',
 'ELEVATORS_MODE',
 'APARTMENTS_MEDI',
 'APARTMENTS_AVG',
 'APARTMENTS_MODE',
 'ENTRANCES_MEDI',
 'ENTRANCES_AVG',
 'ENTRANCES_MODE',
 'LIVINGAREA_AVG',
 'LIVINGAREA_MODE',
 'LIVINGAREA_MEDI',
 'FLOORSMAX_MODE',
 'FLOORSMAX_MEDI',
 'FLOORSMAX_AVG',
 'YEARS_BEGINEXPLUATATION_MODE',
 'YEARS_BEGINEXPLUATATION_MEDI',
 'YEARS_BEGINEXPLUATATION_AVG',
 'TOTALAREA_MODE',
 'EXT_SOURCE_3',
 'AMT_REQ_CREDIT_BUREAU_HOUR',
 'AMT_REQ_CREDIT_BUREAU_DAY',
 'AMT_REQ_CREDIT_BUREAU_WEEK',
 'AMT_REQ_CREDIT_BUREAU_MON',
 'AMT_REQ_CREDIT_BUREAU_QRT',
 'AMT_REQ_CREDIT_BUREAU_YEAR',
 'OBS_30_CNT_SOCIAL_CIRCLE',
 'DEF_30_CNT_SOCIAL_CIRCLE',
 'OBS_60_CNT_SOCIAL_CIRCLE',
 'DEF_60_CNT_SOCIAL_CIRCLE',
 'EXT_SOURCE_2',
 'AMT_GOODS_PRICE',
 'AMT_ANNUITY',
 'CNT_FAM_MEMBERS',
 'DAYS_LAST_PHONE_CHANGE',
 'AMT_CREDIT',
 'AMT_INCOME_TOTAL',
 'DAYS_REGISTRATION',
 'REGION_POPULATION_RELATIVE']

Tratamiento de outliers¶

Los valores outlier se pueden sustituir por la media, mediana, valores extremos (media+3std o media-3std). Tras el siguiente análisis, he decidido como primera iteración dejarlos sin sustituir. Una vez llegue al modelo puedo realizar iteraciones utilizando diferentes métodos para comprobar si mejora el modelo

In [61]:
f_aux.get_deviation_of_mean_perc(df_application_train, list_var_continuous, target='TARGET', multiplier=3)
Out[61]:
0.0 1.0 variable sum_outlier_values porcentaje_sum_null_values
0 0.950626 0.049374 COMMONAREA_MEDI 1357 0.005516
1 0.952416 0.047584 COMMONAREA_AVG 1345 0.005467
2 0.947170 0.052830 COMMONAREA_MODE 1325 0.005386
3 0.921245 0.078755 NONLIVINGAPARTMENTS_MODE 546 0.002219
4 0.928082 0.071918 NONLIVINGAPARTMENTS_AVG 584 0.002374
5 0.929066 0.070934 NONLIVINGAPARTMENTS_MEDI 578 0.002350
6 0.948432 0.051568 LIVINGAPARTMENTS_MODE 1435 0.005833
7 0.952278 0.047722 LIVINGAPARTMENTS_AVG 1383 0.005622
8 0.950714 0.049286 LIVINGAPARTMENTS_MEDI 1400 0.005691
9 0.966527 0.033473 FLOORSMIN_AVG 478 0.001943
10 0.968831 0.031169 FLOORSMIN_MODE 385 0.001565
11 0.966667 0.033333 FLOORSMIN_MEDI 450 0.001829
12 0.930599 0.069401 YEARS_BUILD_MEDI 951 0.003866
13 0.929474 0.070526 YEARS_BUILD_MODE 950 0.003862
14 0.929787 0.070213 YEARS_BUILD_AVG 940 0.003821
15 0.917833 0.082167 OWN_CAR_AGE 2714 0.011032
16 0.941632 0.058368 LANDAREA_MEDI 1679 0.006825
17 0.941833 0.058167 LANDAREA_MODE 1702 0.006918
18 0.941319 0.058681 LANDAREA_AVG 1653 0.006719
19 0.946284 0.053716 BASEMENTAREA_MEDI 1601 0.006508
20 0.945741 0.054259 BASEMENTAREA_AVG 1585 0.006443
21 0.944276 0.055724 BASEMENTAREA_MODE 1651 0.006711
22 0.948809 0.051191 NONLIVINGAREA_MODE 1973 0.008020
23 0.948019 0.051981 NONLIVINGAREA_AVG 1943 0.007898
24 0.949048 0.050952 NONLIVINGAREA_MEDI 1943 0.007898
25 0.955062 0.044938 ELEVATORS_MEDI 1936 0.007870
26 0.955316 0.044684 ELEVATORS_AVG 1947 0.007914
27 0.952327 0.047673 ELEVATORS_MODE 2664 0.010829
28 0.951633 0.048367 APARTMENTS_MEDI 2419 0.009833
29 0.952501 0.047499 APARTMENTS_AVG 2379 0.009670
30 0.951626 0.048374 APARTMENTS_MODE 2398 0.009748
31 0.939684 0.060316 ENTRANCES_MEDI 1774 0.007211
32 0.940544 0.059456 ENTRANCES_AVG 1766 0.007179
33 0.943495 0.056505 ENTRANCES_MODE 2106 0.008561
34 0.950429 0.049571 LIVINGAREA_AVG 2562 0.010414
35 0.948900 0.051100 LIVINGAREA_MODE 2681 0.010898
36 0.951125 0.048875 LIVINGAREA_MEDI 2578 0.010479
37 0.960626 0.039374 FLOORSMAX_MODE 2108 0.008569
38 0.959799 0.040201 FLOORSMAX_MEDI 2189 0.008898
39 0.958373 0.041627 FLOORSMAX_AVG 2090 0.008496
40 0.903525 0.096475 YEARS_BEGINEXPLUATATION_MODE 539 0.002191
41 0.901923 0.098077 YEARS_BEGINEXPLUATATION_MEDI 520 0.002114
42 0.905109 0.094891 YEARS_BEGINEXPLUATATION_AVG 548 0.002228
43 0.956734 0.043266 TOTALAREA_MODE 2658 0.010805
44 0.922481 0.077519 AMT_REQ_CREDIT_BUREAU_HOUR 1290 0.005244
45 0.904318 0.095682 AMT_REQ_CREDIT_BUREAU_DAY 1181 0.004801
46 0.919511 0.080489 AMT_REQ_CREDIT_BUREAU_WEEK 6796 0.027625
47 0.946693 0.053307 AMT_REQ_CREDIT_BUREAU_MON 2570 0.010447
48 0.914917 0.085083 AMT_REQ_CREDIT_BUREAU_QRT 1857 0.007549
49 0.911144 0.088856 AMT_REQ_CREDIT_BUREAU_YEAR 2701 0.010979
50 0.914391 0.085609 OBS_30_CNT_SOCIAL_CIRCLE 4871 0.019800
51 0.879119 0.120881 DEF_30_CNT_SOCIAL_CIRCLE 5493 0.022329
52 0.913640 0.086360 OBS_60_CNT_SOCIAL_CIRCLE 4736 0.019251
53 0.872577 0.127423 DEF_60_CNT_SOCIAL_CIRCLE 3147 0.012792
54 0.961642 0.038358 AMT_GOODS_PRICE 3337 0.013565
55 0.965430 0.034570 AMT_ANNUITY 2372 0.009642
56 0.904997 0.095003 CNT_FAM_MEMBERS 3242 0.013178
57 0.955598 0.044402 DAYS_LAST_PHONE_CHANGE 518 0.002106
58 0.958188 0.041812 AMT_CREDIT 2583 0.010500
59 0.950249 0.049751 AMT_INCOME_TOTAL 201 0.000817
60 0.959016 0.040984 DAYS_REGISTRATION 610 0.002480
61 0.960159 0.039841 REGION_POPULATION_RELATIVE 6777 0.027548

Análisis de Outliers y Distribución en Variables Clases¶

Distribución entre Clases Variables como DEF_30_CNT_SOCIAL_CIRCLE y DEF_60_CNT_SOCIAL_CIRCLE muestran altas proporciones en la clase 1.0 (22.33% y 12.79%, respectivamente), lo que sugiere que estas variables son significativas para el análisis de riesgo crediticio. La alta presencia de valores en la clase 1.0 indica que los clientes con mayores valores en estas variables tienen una mayor probabilidad de incumplir con los pagos. Esto refuerza la necesidad de monitorear de cerca estos indicadores para mitigar el riesgo crediticio.

Valores Atípicos (Outliers) Variables como COMMONAREA_MEDI, COMMONAREA_AVG, y COMMONAREA_MODE presentan un número considerable de valores atípicos:

  • COMMONAREA_MEDI: 1357 valores atípicos (0.55% de los datos totales).

  • COMMONAREA_AVG: 1345 valores atípicos (0.55% de los datos totales).

  • COMMONAREA_MODE: 1325 valores atípicos (0.54% de los datos totales).

Otras variables con niveles significativos de outliers incluyen:

  • LIVINGAPARTMENTS_MODE: 1435 valores atípicos (0.58%).

  • YEARS_BUILD_MEDI: 951 valores atípicos (0.39%).

  • OWN_CAR_AGE: 2714 valores atípicos (1.10%).

Esta variabilidad sugiere la necesidad de aplicar transformaciones de datos para normalizar las distribuciones y mejorar la precisión de los modelos predictivos.

Porcentaje de Valores Nulos Algunas variables presentan un porcentaje significativo de valores nulos:

  • OWN_CAR_AGE: 1.1% de valores nulos.

  • AMT_REQ_CREDIT_BUREAU_HOUR: 0.52% de valores nulos.

  • OBS_30_CNT_SOCIAL_CIRCLE: 1.98% de valores nulos.

Es crucial manejar estos valores nulos mediante imputación o eliminación, dependiendo de la importancia de la variable en el análisis. Las técnicas de imputación pueden incluir la media, la mediana, o el uso de diversos algoritmos.

Variables Clave para el Riesgo Variables como OBS_30_CNT_SOCIAL_CIRCLE (19.8% en la clase 1.0) y AMT_REQ_CREDIT_BUREAU_YEAR (10.98%) son indicadores clave del comportamiento de pago. Estos predictores necesitan un manejo adecuado de los valores nulos y atípicos para garantizar su eficacia en los modelos de riesgo crediticio.

Correlaciones¶

In [83]:
f_aux.get_corr_matrix(dataset = df_application_train[list_var_continuous], 
                metodo='pearson', size_figure=[10,8])

plt.savefig('correlation_matrix.png', format='png')
plt.show()
No description has been provided for this image
<Figure size 640x480 with 0 Axes>

Análisis de la matriz de correlación¶

Analizando la matriz de correlación del conjunto de datos BAF, se observa un patrón significativo de correlaciones moderadas a fuertes (valores entre 0.4 y 0.8) entre las variables relacionadas con las características de los apartamentos y áreas comunes (COMMONAREA_MEDI, LIVINGAPARTMENTS_MODE, NONLIVINGAPARTMENTS_AVG). Esto sugiere una estructura coherente en la forma en que las propiedades están organizadas y documentadas en el sistema bancario, lo cual es relevante para la detección de patrones potencialmente fraudulentos. Asimismo, variables como COMMONAREA_MEDI y COMMONAREA_MODE, y YEARS_BUILD_MEDI y YEARS_BUILD_AVG, presentan altas correlaciones. Esta redundancia sugiere que pueden capturar información similar, lo cual es útil para simplificar el modelo eliminando o combinando estas variables, según el análisis .

Por otra parte, las variables relacionadas con información crediticia y financiera (AMT_REQ_CREDIT_BUREAU_HOUR, AMT_REQ_CREDIT_BUREAU_WEEK, OBS_30_CNT_SOCIAL_CIRCLE) muestran correlaciones débiles entre sí (valores cercanos a 0), lo que indica independencia en los diferentes aspectos del comportamiento financiero de los clientes. Esta independencia es particularmente valiosa para los modelos de detección de fraude, ya que permite capturar diferentes dimensiones del riesgo sin redundancia informativa.

In [47]:
corr = df_application_train[list_var_continuous].corr('pearson')
new_corr = corr.abs()
new_corr.loc[:,:] = np.tril(new_corr, k=-1) # below main lower triangle of an array
new_corr = new_corr.stack().to_frame('correlation').reset_index().sort_values(by='correlation', ascending=False)
new_corr[new_corr['correlation']>0.6]
Out[47]:
level_0 level_1 correlation
922 YEARS_BUILD_AVG YEARS_BUILD_MEDI 0.998541
3562 OBS_60_CNT_SOCIAL_CIRCLE OBS_30_CNT_SOCIAL_CIRCLE 0.998375
724 FLOORSMIN_MEDI FLOORSMIN_AVG 0.997330
2639 FLOORSMAX_AVG FLOORSMAX_MEDI 0.997097
2177 ENTRANCES_AVG ENTRANCES_MEDI 0.996892
65 COMMONAREA_AVG COMMONAREA_MEDI 0.996795
1781 ELEVATORS_AVG ELEVATORS_MEDI 0.996114
2440 LIVINGAREA_MEDI LIVINGAREA_AVG 0.995529
1979 APARTMENTS_AVG APARTMENTS_MEDI 0.994567
2837 YEARS_BEGINEXPLUATATION_AVG YEARS_BEGINEXPLUATATION_MEDI 0.993656
527 LIVINGAPARTMENTS_MEDI LIVINGAPARTMENTS_AVG 0.993497
1319 BASEMENTAREA_AVG BASEMENTAREA_MEDI 0.993394
329 NONLIVINGAPARTMENTS_MEDI NONLIVINGAPARTMENTS_AVG 0.993332
1186 LANDAREA_AVG LANDAREA_MEDI 0.991841
1649 NONLIVINGAREA_MEDI NONLIVINGAREA_AVG 0.990919
923 YEARS_BUILD_AVG YEARS_BUILD_MODE 0.989274
857 YEARS_BUILD_MODE YEARS_BUILD_MEDI 0.989215
725 FLOORSMIN_MEDI FLOORSMIN_MODE 0.988394
2573 FLOORSMAX_MEDI FLOORSMAX_MODE 0.987911
4022 AMT_CREDIT AMT_GOODS_PRICE 0.986973
659 FLOORSMIN_MODE FLOORSMIN_AVG 0.985892
2638 FLOORSMAX_AVG FLOORSMAX_MODE 0.985447
1846 ELEVATORS_MODE ELEVATORS_MEDI 0.982740
1121 LANDAREA_MODE LANDAREA_MEDI 0.981076
2242 ENTRANCES_MODE ENTRANCES_MEDI 0.980548
130 COMMONAREA_MODE COMMONAREA_MEDI 0.980419
131 COMMONAREA_MODE COMMONAREA_AVG 0.978819
1847 ELEVATORS_MODE ELEVATORS_AVG 0.978718
1384 BASEMENTAREA_MODE BASEMENTAREA_MEDI 0.977995
328 NONLIVINGAPARTMENTS_MEDI NONLIVINGAPARTMENTS_MODE 0.977673
2243 ENTRANCES_MODE ENTRANCES_AVG 0.977673
2044 APARTMENTS_MODE APARTMENTS_MEDI 0.977121
1648 NONLIVINGAREA_MEDI NONLIVINGAREA_MODE 0.974850
1187 LANDAREA_AVG LANDAREA_MODE 0.974636
526 LIVINGAPARTMENTS_MEDI LIVINGAPARTMENTS_MODE 0.974272
2441 LIVINGAREA_MEDI LIVINGAREA_MODE 0.974267
1385 BASEMENTAREA_MODE BASEMENTAREA_AVG 0.972668
2045 APARTMENTS_MODE APARTMENTS_AVG 0.972521
2836 YEARS_BEGINEXPLUATATION_AVG YEARS_BEGINEXPLUATATION_MODE 0.972250
2375 LIVINGAREA_MODE LIVINGAREA_AVG 0.971586
263 NONLIVINGAPARTMENTS_AVG NONLIVINGAPARTMENTS_MODE 0.971156
461 LIVINGAPARTMENTS_AVG LIVINGAPARTMENTS_MODE 0.968290
1583 NONLIVINGAREA_AVG NONLIVINGAREA_MODE 0.965607
2771 YEARS_BEGINEXPLUATATION_MEDI YEARS_BEGINEXPLUATATION_MODE 0.964416
1957 APARTMENTS_AVG LIVINGAPARTMENTS_AVG 0.941907
1893 APARTMENTS_MEDI LIVINGAPARTMENTS_MEDI 0.939974
1958 APARTMENTS_AVG LIVINGAPARTMENTS_MEDI 0.939133
2021 APARTMENTS_MODE LIVINGAPARTMENTS_MODE 0.936395
1892 APARTMENTS_MEDI LIVINGAPARTMENTS_AVG 0.932748
1891 APARTMENTS_MEDI LIVINGAPARTMENTS_MODE 0.930923
1956 APARTMENTS_AVG LIVINGAPARTMENTS_MODE 0.928522
2895 TOTALAREA_MODE LIVINGAREA_AVG 0.923938
2897 TOTALAREA_MODE LIVINGAREA_MEDI 0.918448
2434 LIVINGAREA_MEDI APARTMENTS_MEDI 0.916163
2305 LIVINGAREA_AVG APARTMENTS_AVG 0.913431
2304 LIVINGAREA_AVG APARTMENTS_MEDI 0.912751
2023 APARTMENTS_MODE LIVINGAPARTMENTS_MEDI 0.912120
2435 LIVINGAREA_MEDI APARTMENTS_AVG 0.912055
2371 LIVINGAREA_MODE APARTMENTS_MODE 0.910854
2022 APARTMENTS_MODE LIVINGAPARTMENTS_AVG 0.905281
2896 TOTALAREA_MODE LIVINGAREA_MODE 0.898201
2369 LIVINGAREA_MODE APARTMENTS_MEDI 0.896154
2436 LIVINGAREA_MEDI APARTMENTS_MODE 0.894534
2370 LIVINGAREA_MODE APARTMENTS_AVG 0.892935
2890 TOTALAREA_MODE APARTMENTS_AVG 0.891761
2306 LIVINGAREA_AVG APARTMENTS_MODE 0.891096
2889 TOTALAREA_MODE APARTMENTS_MEDI 0.886290
2413 LIVINGAREA_MEDI LIVINGAPARTMENTS_MEDI 0.881342
2283 LIVINGAREA_AVG LIVINGAPARTMENTS_MEDI 0.879898
2282 LIVINGAREA_AVG LIVINGAPARTMENTS_AVG 0.877002
2346 LIVINGAREA_MODE LIVINGAPARTMENTS_MODE 0.876562
2412 LIVINGAREA_MEDI LIVINGAPARTMENTS_AVG 0.874502
2411 LIVINGAREA_MEDI LIVINGAPARTMENTS_MODE 0.872826
2281 LIVINGAREA_AVG LIVINGAPARTMENTS_MODE 0.871391
2431 LIVINGAREA_MEDI ELEVATORS_MEDI 0.867304
2302 LIVINGAREA_AVG ELEVATORS_AVG 0.866936
2301 LIVINGAREA_AVG ELEVATORS_MEDI 0.864935
2432 LIVINGAREA_MEDI ELEVATORS_AVG 0.864576
2891 TOTALAREA_MODE APARTMENTS_MODE 0.863831
3628 DEF_60_CNT_SOCIAL_CIRCLE DEF_30_CNT_SOCIAL_CIRCLE 0.858585
2368 LIVINGAREA_MODE ELEVATORS_MODE 0.855085
2433 LIVINGAREA_MEDI ELEVATORS_MODE 0.854719
2348 LIVINGAREA_MODE LIVINGAPARTMENTS_MEDI 0.853603
2303 LIVINGAREA_AVG ELEVATORS_MODE 0.851599
2347 LIVINGAREA_MODE LIVINGAPARTMENTS_AVG 0.847424
2887 TOTALAREA_MODE ELEVATORS_AVG 0.844045
2867 TOTALAREA_MODE LIVINGAPARTMENTS_AVG 0.843934
2868 TOTALAREA_MODE LIVINGAPARTMENTS_MEDI 0.842581
2366 LIVINGAREA_MODE ELEVATORS_MEDI 0.839940
1911 APARTMENTS_MEDI ELEVATORS_MEDI 0.837902
2367 LIVINGAREA_MODE ELEVATORS_AVG 0.837747
2886 TOTALAREA_MODE ELEVATORS_MEDI 0.837582
1977 APARTMENTS_AVG ELEVATORS_AVG 0.837210
1976 APARTMENTS_AVG ELEVATORS_MEDI 0.835271
1912 APARTMENTS_MEDI ELEVATORS_AVG 0.835070
2866 TOTALAREA_MODE LIVINGAPARTMENTS_MODE 0.831438
2043 APARTMENTS_MODE ELEVATORS_MODE 0.827136
1913 APARTMENTS_MEDI ELEVATORS_MODE 0.826041
1978 APARTMENTS_AVG ELEVATORS_MODE 0.822539
2888 TOTALAREA_MODE ELEVATORS_MODE 0.820294
1698 ELEVATORS_MEDI LIVINGAPARTMENTS_MEDI 0.812928
1763 ELEVATORS_AVG LIVINGAPARTMENTS_MEDI 0.811431
1762 ELEVATORS_AVG LIVINGAPARTMENTS_AVG 0.810191
2041 APARTMENTS_MODE ELEVATORS_MEDI 0.809595
1826 ELEVATORS_MODE LIVINGAPARTMENTS_MODE 0.807788
1697 ELEVATORS_MEDI LIVINGAPARTMENTS_AVG 0.807709
2042 APARTMENTS_MODE ELEVATORS_AVG 0.806702
1696 ELEVATORS_MEDI LIVINGAPARTMENTS_MODE 0.799072
1828 ELEVATORS_MODE LIVINGAPARTMENTS_MEDI 0.797843
1761 ELEVATORS_AVG LIVINGAPARTMENTS_MODE 0.797293
1827 ELEVATORS_MODE LIVINGAPARTMENTS_AVG 0.792087
3827 AMT_ANNUITY AMT_GOODS_PRICE 0.775607
4023 AMT_CREDIT AMT_ANNUITY 0.770909
2609 FLOORSMAX_AVG FLOORSMIN_AVG 0.742606
2546 FLOORSMAX_MEDI FLOORSMIN_MEDI 0.740330
2544 FLOORSMAX_MEDI FLOORSMIN_AVG 0.739968
2611 FLOORSMAX_AVG FLOORSMIN_MEDI 0.739934
2481 FLOORSMAX_MODE FLOORSMIN_MEDI 0.729638
2479 FLOORSMAX_MODE FLOORSMIN_AVG 0.728972
2480 FLOORSMAX_MODE FLOORSMIN_MODE 0.726967
2545 FLOORSMAX_MEDI FLOORSMIN_MODE 0.723297
2610 FLOORSMAX_AVG FLOORSMIN_MODE 0.722565
2294 LIVINGAREA_AVG BASEMENTAREA_MEDI 0.692146
2295 LIVINGAREA_AVG BASEMENTAREA_AVG 0.692008
2424 LIVINGAREA_MEDI BASEMENTAREA_MEDI 0.691154
2361 LIVINGAREA_MODE BASEMENTAREA_MODE 0.689359
2425 LIVINGAREA_MEDI BASEMENTAREA_AVG 0.688709
2627 FLOORSMAX_AVG ELEVATORS_AVG 0.682034
1904 APARTMENTS_MEDI BASEMENTAREA_MEDI 0.681576
2359 LIVINGAREA_MODE BASEMENTAREA_MEDI 0.680290
2562 FLOORSMAX_MEDI ELEVATORS_AVG 0.679692
1970 APARTMENTS_AVG BASEMENTAREA_AVG 0.679499
1969 APARTMENTS_AVG BASEMENTAREA_MEDI 0.679434
1905 APARTMENTS_MEDI BASEMENTAREA_AVG 0.678934
2036 APARTMENTS_MODE BASEMENTAREA_MODE 0.678883
2626 FLOORSMAX_AVG ELEVATORS_MEDI 0.678061
2561 FLOORSMAX_MEDI ELEVATORS_MEDI 0.677529
2360 LIVINGAREA_MODE BASEMENTAREA_AVG 0.676242
2497 FLOORSMAX_MODE ELEVATORS_AVG 0.672738
2296 LIVINGAREA_AVG BASEMENTAREA_MODE 0.672313
2880 TOTALAREA_MODE BASEMENTAREA_AVG 0.672107
2426 LIVINGAREA_MEDI BASEMENTAREA_MODE 0.671869
2496 FLOORSMAX_MODE ELEVATORS_MEDI 0.670744
2034 APARTMENTS_MODE BASEMENTAREA_MEDI 0.670177
2879 TOTALAREA_MODE BASEMENTAREA_MEDI 0.669521
2035 APARTMENTS_MODE BASEMENTAREA_AVG 0.666916
1906 APARTMENTS_MEDI BASEMENTAREA_MODE 0.663709
2498 FLOORSMAX_MODE ELEVATORS_MODE 0.662805
1971 APARTMENTS_AVG BASEMENTAREA_MODE 0.660472
2628 FLOORSMAX_AVG ELEVATORS_MODE 0.657906
2563 FLOORSMAX_MEDI ELEVATORS_MODE 0.657274
2231 ENTRANCES_MODE BASEMENTAREA_MODE 0.656749
2166 ENTRANCES_AVG BASEMENTAREA_MODE 0.656123
2164 ENTRANCES_AVG BASEMENTAREA_MEDI 0.655797
2101 ENTRANCES_MEDI BASEMENTAREA_MODE 0.655316
1371 BASEMENTAREA_MODE LIVINGAPARTMENTS_MODE 0.654539
2099 ENTRANCES_MEDI BASEMENTAREA_MEDI 0.654480
1241 BASEMENTAREA_MEDI LIVINGAPARTMENTS_MODE 0.653390
2165 ENTRANCES_AVG BASEMENTAREA_AVG 0.653363
1243 BASEMENTAREA_MEDI LIVINGAPARTMENTS_MEDI 0.652090
2100 ENTRANCES_MEDI BASEMENTAREA_AVG 0.649411
1308 BASEMENTAREA_AVG LIVINGAPARTMENTS_MEDI 0.648910
2881 TOTALAREA_MODE BASEMENTAREA_MODE 0.648268
1306 BASEMENTAREA_AVG LIVINGAPARTMENTS_MODE 0.648179
1242 BASEMENTAREA_MEDI LIVINGAPARTMENTS_AVG 0.646934
1307 BASEMENTAREA_AVG LIVINGAPARTMENTS_AVG 0.646320
2900 TOTALAREA_MODE FLOORSMAX_AVG 0.634444
2229 ENTRANCES_MODE BASEMENTAREA_MEDI 0.633730
2899 TOTALAREA_MODE FLOORSMAX_MEDI 0.631766
2635 FLOORSMAX_AVG LIVINGAREA_AVG 0.631640
2570 FLOORSMAX_MEDI LIVINGAREA_AVG 0.629500
1373 BASEMENTAREA_MODE LIVINGAPARTMENTS_MEDI 0.628567
2230 ENTRANCES_MODE BASEMENTAREA_AVG 0.628242
2637 FLOORSMAX_AVG LIVINGAREA_MEDI 0.628135
2572 FLOORSMAX_MEDI LIVINGAREA_MEDI 0.627292
2898 TOTALAREA_MODE FLOORSMAX_MODE 0.627108
2505 FLOORSMAX_MODE LIVINGAREA_AVG 0.626861
2507 FLOORSMAX_MODE LIVINGAREA_MEDI 0.624993
1372 BASEMENTAREA_MODE LIVINGAPARTMENTS_AVG 0.623224
2373 LIVINGAREA_MODE ENTRANCES_AVG 0.621636
2374 LIVINGAREA_MODE ENTRANCES_MODE 0.621611
2372 LIVINGAREA_MODE ENTRANCES_MEDI 0.620966
2630 FLOORSMAX_AVG APARTMENTS_AVG 0.619744
2438 LIVINGAREA_MEDI ENTRANCES_AVG 0.618093
2308 LIVINGAREA_AVG ENTRANCES_AVG 0.617722
2437 LIVINGAREA_MEDI ENTRANCES_MEDI 0.617581
2565 FLOORSMAX_MEDI APARTMENTS_AVG 0.617518
2629 FLOORSMAX_AVG APARTMENTS_MEDI 0.616272
2564 FLOORSMAX_MEDI APARTMENTS_MEDI 0.615321
2500 FLOORSMAX_MODE APARTMENTS_AVG 0.615296
2241 ENTRANCES_MODE APARTMENTS_MODE 0.615235
2307 LIVINGAREA_AVG ENTRANCES_MEDI 0.613822
2499 FLOORSMAX_MODE APARTMENTS_MEDI 0.613427
2111 ENTRANCES_MEDI APARTMENTS_MODE 0.612070
2176 ENTRANCES_AVG APARTMENTS_MODE 0.611982
2174 ENTRANCES_AVG APARTMENTS_MEDI 0.611266
2109 ENTRANCES_MEDI APARTMENTS_MEDI 0.610921
2175 ENTRANCES_AVG APARTMENTS_AVG 0.610528
2506 FLOORSMAX_MODE LIVINGAREA_MODE 0.607184
2110 ENTRANCES_MEDI APARTMENTS_AVG 0.606728

Variables con correlación extremadamente alta (> 0.99):¶

OBS_60_CNT_SOCIAL_CIRCLE y OBS_30_CNT_SOCIAL_CIRCLE (0.9985): Estas dos variables probablemente representan conteos de observaciones sociales en diferentes intervalos de tiempo (60 y 30 días), lo cual indica una relación cercana ya que están midiendo algo muy similar. Podría ser redundante conservar ambas variables, y se podría eliminar una para reducir la multicolinealidad. Otros ejemplos con correlaciones cercanas a 1 incluyen pares como YEARS_BUILD_AVG y YEARS_BUILD_MEDI (0.9984), y FLOORSMIN_MEDI y FLOORSMIN_AVG (0.9972), que también sugieren duplicidad en la información.

Variables de medidas promedio y mediana (AVG y MEDI):¶

Las variables con sufijos AVG, MEDI y MODE (promedio, mediana y moda) de características similares como FLOORSMAX, LIVINGAREA, APARTMENTS, ELEVATORS, etc., tienden a tener una alta correlación entre sí. A partir de esto, se puede analizar que, en muchos casos, la media, mediana y moda de estas características tienden a ser valores cercanos. Por ejemplo, ENTRANCES_AVG y ENTRANCES_MEDI tienen una correlación de 0.9969. En estos casos, se podría optar por seleccionar solo una de estas variables representativas (como AVG o MEDI) para reducir la redundancia sin perder información significativa.

Relación entre área y otras variables estructurales:¶

LIVINGAREA, BASEMENTAREA, y APARTMENTS están muy correlacionadas entre sí. Por ejemplo, LIVINGAREA_MEDI y APARTMENTS_MEDI tienen una correlación de 0.9163. Esto sugiere que los tamaños de áreas habitables y apartamentos suelen estar alineados. La alta correlación entre estas áreas y otras variables estructurales puede indicar que las características de tamaño y espacio tienen un comportamiento consistente en los registros, algo que es útil para el análisis de propiedades o evaluaciones.

Total Area vs. Componentes individuales:¶

TOTALAREA_MODE está altamente correlacionado con otras áreas específicas como LIVINGAREA y APARTMENTS, indicando que el área total tiende a ser una combinación directa de estas variables. Por ejemplo, TOTALAREA_MODE y LIVINGAREA_AVG tienen una correlación de 0.9251. Es probable que TOTALAREA_MODE esté estrechamente relacionada con las áreas individuales, por lo que es necesario hacer un estudio para determinar el valor de cada una de estas áreas en el presente análisis.

Posible problema de multicolinealidad:¶

La alta correlación entre estas variables genera un problema conocido como multicolinealidad. Esto significa que las variables están tan estrechamente relacionadas que es difícil determinar el efecto único de cada una sobre la variable dependiente en un modelo de regresión. Para resolver este problema, se pueden aplicar técnicas como el Análisis de Componentes Principales (PCA) o eliminar algunas de las variables altamente correlacionadas.

Por último, decidimos en esta primera iteración, no eliminar correlaciones. Sin embargo, si al final se aplica algún algoritmo que lo requiera, se eliminaran las correlaciones correspondientes.

Tratamiento de Valores Nulos¶

En este apartado se van a considerar las siguientes preguntas ¿Son todos los nulos de una clase de la variable objetivo? o ¿Tienen el mismo porcentaje de la variable objetivo?

In [147]:
list_var_continuous
Out[147]:
['COMMONAREA_MEDI',
 'COMMONAREA_AVG',
 'COMMONAREA_MODE',
 'NONLIVINGAPARTMENTS_MODE',
 'NONLIVINGAPARTMENTS_AVG',
 'NONLIVINGAPARTMENTS_MEDI',
 'LIVINGAPARTMENTS_MODE',
 'LIVINGAPARTMENTS_AVG',
 'LIVINGAPARTMENTS_MEDI',
 'FLOORSMIN_AVG',
 'FLOORSMIN_MODE',
 'FLOORSMIN_MEDI',
 'YEARS_BUILD_MEDI',
 'YEARS_BUILD_MODE',
 'YEARS_BUILD_AVG',
 'OWN_CAR_AGE',
 'LANDAREA_MEDI',
 'LANDAREA_MODE',
 'LANDAREA_AVG',
 'BASEMENTAREA_MEDI',
 'BASEMENTAREA_AVG',
 'BASEMENTAREA_MODE',
 'EXT_SOURCE_1',
 'NONLIVINGAREA_MODE',
 'NONLIVINGAREA_AVG',
 'NONLIVINGAREA_MEDI',
 'ELEVATORS_MEDI',
 'ELEVATORS_AVG',
 'ELEVATORS_MODE',
 'APARTMENTS_MEDI',
 'APARTMENTS_AVG',
 'APARTMENTS_MODE',
 'ENTRANCES_MEDI',
 'ENTRANCES_AVG',
 'ENTRANCES_MODE',
 'LIVINGAREA_AVG',
 'LIVINGAREA_MODE',
 'LIVINGAREA_MEDI',
 'FLOORSMAX_MODE',
 'FLOORSMAX_MEDI',
 'FLOORSMAX_AVG',
 'YEARS_BEGINEXPLUATATION_MODE',
 'YEARS_BEGINEXPLUATATION_MEDI',
 'YEARS_BEGINEXPLUATATION_AVG',
 'TOTALAREA_MODE',
 'EXT_SOURCE_3',
 'AMT_REQ_CREDIT_BUREAU_HOUR',
 'AMT_REQ_CREDIT_BUREAU_DAY',
 'AMT_REQ_CREDIT_BUREAU_WEEK',
 'AMT_REQ_CREDIT_BUREAU_MON',
 'AMT_REQ_CREDIT_BUREAU_QRT',
 'AMT_REQ_CREDIT_BUREAU_YEAR',
 'OBS_30_CNT_SOCIAL_CIRCLE',
 'DEF_30_CNT_SOCIAL_CIRCLE',
 'OBS_60_CNT_SOCIAL_CIRCLE',
 'DEF_60_CNT_SOCIAL_CIRCLE',
 'EXT_SOURCE_2',
 'AMT_GOODS_PRICE',
 'AMT_ANNUITY',
 'CNT_FAM_MEMBERS',
 'DAYS_LAST_PHONE_CHANGE',
 'AMT_CREDIT',
 'AMT_INCOME_TOTAL',
 'DAYS_REGISTRATION',
 'REGION_POPULATION_RELATIVE']
In [149]:
f_aux.get_percent_null_values_target(df_application_train, list_var_continuous, target='TARGET')
Out[149]:
0.0 1.0 variable sum_null_values porcentaje_sum_null_values
0 0.914264 0.085736 COMMONAREA_MEDI 171807 0.698380
1 0.914264 0.085736 COMMONAREA_AVG 171807 0.698380
2 0.914264 0.085736 COMMONAREA_MODE 171807 0.698380
3 0.914240 0.085760 NONLIVINGAPARTMENTS_MODE 170790 0.694246
4 0.914240 0.085760 NONLIVINGAPARTMENTS_AVG 170790 0.694246
5 0.914240 0.085760 NONLIVINGAPARTMENTS_MEDI 170790 0.694246
6 0.913842 0.086158 LIVINGAPARTMENTS_MODE 168087 0.683258
7 0.913842 0.086158 LIVINGAPARTMENTS_AVG 168087 0.683258
8 0.913842 0.086158 LIVINGAPARTMENTS_MEDI 168087 0.683258
9 0.913712 0.086288 FLOORSMIN_AVG 166825 0.678128
10 0.913712 0.086288 FLOORSMIN_MODE 166825 0.678128
11 0.913712 0.086288 FLOORSMIN_MEDI 166825 0.678128
12 0.913235 0.086765 YEARS_BUILD_MEDI 163534 0.664751
13 0.913235 0.086765 YEARS_BUILD_MODE 163534 0.664751
14 0.913235 0.086765 YEARS_BUILD_AVG 163534 0.664751
15 0.915097 0.084903 OWN_CAR_AGE 162385 0.660080
16 0.911722 0.088278 LANDAREA_MEDI 145926 0.593176
17 0.911722 0.088278 LANDAREA_MODE 145926 0.593176
18 0.911722 0.088278 LANDAREA_AVG 145926 0.593176
19 0.910908 0.089092 BASEMENTAREA_MEDI 143829 0.584652
20 0.910908 0.089092 BASEMENTAREA_AVG 143829 0.584652
21 0.910908 0.089092 BASEMENTAREA_MODE 143829 0.584652
22 0.914865 0.085135 EXT_SOURCE_1 138768 0.564079
23 0.909521 0.090479 NONLIVINGAREA_MODE 135623 0.551295
24 0.909521 0.090479 NONLIVINGAREA_AVG 135623 0.551295
25 0.909521 0.090479 NONLIVINGAREA_MEDI 135623 0.551295
26 0.908877 0.091123 ELEVATORS_MEDI 130988 0.532454
27 0.908877 0.091123 ELEVATORS_AVG 130988 0.532454
28 0.908877 0.091123 ELEVATORS_MODE 130988 0.532454
29 0.908361 0.091639 APARTMENTS_MEDI 124761 0.507142
30 0.908361 0.091639 APARTMENTS_AVG 124761 0.507142
31 0.908361 0.091639 APARTMENTS_MODE 124761 0.507142
32 0.908027 0.091973 ENTRANCES_MEDI 123732 0.502959
33 0.908027 0.091973 ENTRANCES_AVG 123732 0.502959
34 0.908027 0.091973 ENTRANCES_MODE 123732 0.502959
35 0.908345 0.091655 LIVINGAREA_AVG 123365 0.501467
36 0.908345 0.091655 LIVINGAREA_MODE 123365 0.501467
37 0.908345 0.091655 LIVINGAREA_MEDI 123365 0.501467
38 0.907842 0.092158 FLOORSMAX_MODE 122323 0.497232
39 0.907842 0.092158 FLOORSMAX_MEDI 122323 0.497232
40 0.907842 0.092158 FLOORSMAX_AVG 122323 0.497232
41 0.907669 0.092331 YEARS_BEGINEXPLUATATION_MODE 119906 0.487407
42 0.907669 0.092331 YEARS_BEGINEXPLUATATION_MEDI 119906 0.487407
43 0.907669 0.092331 YEARS_BEGINEXPLUATATION_AVG 119906 0.487407
44 0.907355 0.092645 TOTALAREA_MODE 118657 0.482330
45 0.906818 0.093182 EXT_SOURCE_3 48722 0.198050
46 0.897002 0.102998 AMT_REQ_CREDIT_BUREAU_HOUR 33156 0.134776
47 0.897002 0.102998 AMT_REQ_CREDIT_BUREAU_DAY 33156 0.134776
48 0.897002 0.102998 AMT_REQ_CREDIT_BUREAU_WEEK 33156 0.134776
49 0.897002 0.102998 AMT_REQ_CREDIT_BUREAU_MON 33156 0.134776
50 0.897002 0.102998 AMT_REQ_CREDIT_BUREAU_QRT 33156 0.134776
51 0.897002 0.102998 AMT_REQ_CREDIT_BUREAU_YEAR 33156 0.134776
52 0.960859 0.039141 OBS_30_CNT_SOCIAL_CIRCLE 792 0.003219
53 0.960859 0.039141 DEF_30_CNT_SOCIAL_CIRCLE 792 0.003219
54 0.960859 0.039141 OBS_60_CNT_SOCIAL_CIRCLE 792 0.003219
55 0.960859 0.039141 DEF_60_CNT_SOCIAL_CIRCLE 792 0.003219
56 0.911591 0.088409 EXT_SOURCE_2 509 0.002069
57 0.927350 0.072650 AMT_GOODS_PRICE 234 0.000951
58 1.000000 0.000000 AMT_ANNUITY 9 0.000037
59 1.000000 0.000000 CNT_FAM_MEMBERS 2 0.000008
60 1.000000 0.000000 DAYS_LAST_PHONE_CHANGE 1 0.000004

Técnicas para tratamiento de valores nulos¶

Cuando se enfrenta a la presencia de valores nulos en un conjunto de datos y no se tiene mucho contexto sobre las variables, se pueden considerar diferentes técnicas para manejarlos. A continuación se presentan varias opciones y sus explicaciones:

Opción 0:¶

Algoritmos que Aceptan Valores Nulos: Algunos algoritmos de machine learning pueden manejar de manera directa los valores nulos en su entrada. Esto significa que no es necesario realizar ninguna imputación o eliminación de datos nulos, ya que el algoritmo cuenta con mecanismos internos para tratar con la ausencia de valores.

Opción 1:¶

Eliminar Filas con Valores Nulos: Se puede optar por eliminar todas las filas que contienen valores nulos. Esta estrategia es simple y garantiza que solo se utilicen datos completos en el modelo. Sin embargo, no es óptima en conjuntos de datos donde muchas filas tienen valores nulos, ya que podría resultar en la pérdida de una cantidad significativa de información.

Opción 2:¶

Imputación de Valores Nulos: Otra opción es imputar los valores nulos utilizando diversas técnicas:

  • media
  • mediana
  • máximo
  • mínimo
  • valores extremose

Decidimos rellenar todas las columnas continuas menos revol_util por el valor -99. De esta manera, se diferencian los outlier del resto de la muestra poninendo un valor muy separado del resto de la variable. Se puede explorar el resultado del modelo utilizando diferentes métodos.

Justificación¶

Rellenar las columnas continuas con un valor como -99 puede ser una estrategia efectiva para tratar los valores nulos, especialmente si se desea diferenciar claramente estos valores de los datos válidos. Aquí están algunas justificaciones y consideraciones para esta técnica:

  • Diferenciación Clara de Valores Nulos: Al usar un valor extremo como -99, se asegura que los valores nulos sean claramente distinguibles del resto de los datos. Esto es particularmente útil en el preprocesamiento y en la fase de modelado, ya que los modelos pueden identificar fácilmente estos valores como especiales.

  • Mantener la Completa Información del Conjunto de Datos: Esta técnica permite mantener todas las filas en el conjunto de datos, evitando la pérdida de información que podría ocurrir si se eliminan filas con valores nulos. Esto es crucial cuando se tiene un conjunto de datos limitado o cuando los valores nulos están distribuidos de manera significativa en el dataset.

  • Flexibilidad para Modelos de Machine Learning: Muchos algoritmos de machine learning pueden manejar valores extremos de manera eficiente y, en algunos casos, pueden interpretar estos valores como indicadores adicionales. Esto puede ayudar a los modelos a aprender patrones adicionales sobre los datos.

  • Simplificación del Preprocesamiento: Imputar todos los valores continuos nulos con un valor constante como -99 simplifica el proceso de preprocesamiento, haciéndolo más rápido y menos propenso a errores.mos

In [57]:
# Verificar valores nulos y su proporción
null_summary = df_application_train[list_var_continuous].isnull().mean().sort_values(ascending=False)
print(null_summary)

# Visualizar la distribución de los valores nulos
import seaborn as sns
import matplotlib.pyplot as plt

plt.figure(figsize=(12, 8))
sns.heatmap(df_application_train[list_var_continuous].isnull(), cbar=False, cmap='viridis')
plt.title('Mapa de Calor de Valores Nulos en Variables Continuas')
plt.show()
COMMONAREA_MEDI                 0.698563
COMMONAREA_MODE                 0.698563
COMMONAREA_AVG                  0.698563
NONLIVINGAPARTMENTS_MODE        0.694063
NONLIVINGAPARTMENTS_MEDI        0.694063
NONLIVINGAPARTMENTS_AVG         0.694063
LIVINGAPARTMENTS_MODE           0.683189
LIVINGAPARTMENTS_AVG            0.683189
LIVINGAPARTMENTS_MEDI           0.683189
FLOORSMIN_AVG                   0.678230
FLOORSMIN_MODE                  0.678230
FLOORSMIN_MEDI                  0.678230
YEARS_BUILD_MEDI                0.664860
YEARS_BUILD_MODE                0.664860
YEARS_BUILD_AVG                 0.664860
OWN_CAR_AGE                     0.660218
LANDAREA_MODE                   0.593684
LANDAREA_AVG                    0.593684
LANDAREA_MEDI                   0.593684
BASEMENTAREA_MEDI               0.585131
BASEMENTAREA_AVG                0.585131
BASEMENTAREA_MODE               0.585131
EXT_SOURCE_1                    0.564339
NONLIVINGAREA_MODE              0.551962
NONLIVINGAREA_AVG               0.551962
NONLIVINGAREA_MEDI              0.551962
ELEVATORS_MEDI                  0.532816
ELEVATORS_AVG                   0.532816
ELEVATORS_MODE                  0.532816
APARTMENTS_MEDI                 0.507378
APARTMENTS_AVG                  0.507378
APARTMENTS_MODE                 0.507378
ENTRANCES_AVG                   0.503451
ENTRANCES_MODE                  0.503451
ENTRANCES_MEDI                  0.503451
LIVINGAREA_MODE                 0.501992
LIVINGAREA_MEDI                 0.501992
LIVINGAREA_AVG                  0.501992
FLOORSMAX_MODE                  0.497557
FLOORSMAX_MEDI                  0.497557
FLOORSMAX_AVG                   0.497557
YEARS_BEGINEXPLUATATION_MODE    0.487618
YEARS_BEGINEXPLUATATION_MEDI    0.487618
YEARS_BEGINEXPLUATATION_AVG     0.487618
TOTALAREA_MODE                  0.482557
EXT_SOURCE_3                    0.198181
AMT_REQ_CREDIT_BUREAU_MON       0.134963
AMT_REQ_CREDIT_BUREAU_QRT       0.134963
AMT_REQ_CREDIT_BUREAU_YEAR      0.134963
AMT_REQ_CREDIT_BUREAU_WEEK      0.134963
AMT_REQ_CREDIT_BUREAU_DAY       0.134963
AMT_REQ_CREDIT_BUREAU_HOUR      0.134963
OBS_30_CNT_SOCIAL_CIRCLE        0.003362
DEF_30_CNT_SOCIAL_CIRCLE        0.003362
OBS_60_CNT_SOCIAL_CIRCLE        0.003362
DEF_60_CNT_SOCIAL_CIRCLE        0.003362
EXT_SOURCE_2                    0.002126
AMT_GOODS_PRICE                 0.000866
AMT_ANNUITY                     0.000033
CNT_FAM_MEMBERS                 0.000008
DAYS_LAST_PHONE_CHANGE          0.000004
AMT_CREDIT                      0.000000
AMT_INCOME_TOTAL                0.000000
DAYS_ID_PUBLISH                 0.000000
DAYS_REGISTRATION               0.000000
DAYS_EMPLOYED                   0.000000
DAYS_BIRTH                      0.000000
REGION_POPULATION_RELATIVE      0.000000
SK_ID_CURR                      0.000000
dtype: float64
No description has been provided for this image
In [58]:
# Suponiendo que df_application_train y df_application_test son tus DataFrames originales
df_application_input_train = df_application_train.copy()
df_application_input_test = df_application_test.copy()

# Definir la lista de variables continuas excluyendo la variable objetivo
list_var_continuous = [col for col in df_application_input_train.columns if df_application_input_train[col].dtype in ['float64', 'int64'] and col != 'TARGET']

# Definir las columnas que no deben ser tocadas (protegidas)
protected_columns = ['OWN_CAR_AGE', 'EXT_SOURCE_1', 'EXT_SOURCE_2', 'EXT_SOURCE_3', 
                     'OBS_30_CNT_SOCIAL_CIRCLE', 'DEF_30_CNT_SOCIAL_CIRCLE', 
                     'OBS_60_CNT_SOCIAL_CIRCLE', 'DEF_60_CNT_SOCIAL_CIRCLE']

# Excluir estas columnas de la lista de imputación
list_vars_to_impute = [col for col in list_var_continuous if col not in protected_columns]

# Imputar valores nulos con -99 en las variables seleccionadas
df_application_input_train[list_vars_to_impute] = df_application_input_train[list_vars_to_impute].fillna(-99)
df_application_input_test[list_vars_to_impute] = df_application_input_test[list_vars_to_impute].fillna(-99)

# Verificar los resultados
print("Valores nulos en las columnas seleccionadas del conjunto de entrenamiento:")
print(df_application_input_train[list_vars_to_impute].isnull().sum())

print("Valores nulos en las columnas seleccionadas del conjunto de prueba:")
print(df_application_input_test[list_vars_to_impute].isnull().sum())
Valores nulos en las columnas seleccionadas del conjunto de entrenamiento:
COMMONAREA_MEDI                 0
COMMONAREA_AVG                  0
COMMONAREA_MODE                 0
NONLIVINGAPARTMENTS_MODE        0
NONLIVINGAPARTMENTS_AVG         0
NONLIVINGAPARTMENTS_MEDI        0
LIVINGAPARTMENTS_MODE           0
LIVINGAPARTMENTS_AVG            0
LIVINGAPARTMENTS_MEDI           0
FLOORSMIN_AVG                   0
FLOORSMIN_MODE                  0
FLOORSMIN_MEDI                  0
YEARS_BUILD_MEDI                0
YEARS_BUILD_MODE                0
YEARS_BUILD_AVG                 0
LANDAREA_MEDI                   0
LANDAREA_MODE                   0
LANDAREA_AVG                    0
BASEMENTAREA_MEDI               0
BASEMENTAREA_AVG                0
BASEMENTAREA_MODE               0
NONLIVINGAREA_MODE              0
NONLIVINGAREA_AVG               0
NONLIVINGAREA_MEDI              0
ELEVATORS_MEDI                  0
ELEVATORS_AVG                   0
ELEVATORS_MODE                  0
APARTMENTS_MEDI                 0
APARTMENTS_AVG                  0
APARTMENTS_MODE                 0
ENTRANCES_MEDI                  0
ENTRANCES_AVG                   0
ENTRANCES_MODE                  0
LIVINGAREA_AVG                  0
LIVINGAREA_MODE                 0
LIVINGAREA_MEDI                 0
FLOORSMAX_MODE                  0
FLOORSMAX_MEDI                  0
FLOORSMAX_AVG                   0
YEARS_BEGINEXPLUATATION_MODE    0
YEARS_BEGINEXPLUATATION_MEDI    0
YEARS_BEGINEXPLUATATION_AVG     0
TOTALAREA_MODE                  0
AMT_REQ_CREDIT_BUREAU_HOUR      0
AMT_REQ_CREDIT_BUREAU_DAY       0
AMT_REQ_CREDIT_BUREAU_WEEK      0
AMT_REQ_CREDIT_BUREAU_MON       0
AMT_REQ_CREDIT_BUREAU_QRT       0
AMT_REQ_CREDIT_BUREAU_YEAR      0
AMT_GOODS_PRICE                 0
AMT_ANNUITY                     0
CNT_FAM_MEMBERS                 0
DAYS_LAST_PHONE_CHANGE          0
AMT_CREDIT                      0
AMT_INCOME_TOTAL                0
DAYS_ID_PUBLISH                 0
DAYS_REGISTRATION               0
DAYS_EMPLOYED                   0
DAYS_BIRTH                      0
REGION_POPULATION_RELATIVE      0
SK_ID_CURR                      0
dtype: int64
Valores nulos en las columnas seleccionadas del conjunto de prueba:
COMMONAREA_MEDI                 0
COMMONAREA_AVG                  0
COMMONAREA_MODE                 0
NONLIVINGAPARTMENTS_MODE        0
NONLIVINGAPARTMENTS_AVG         0
NONLIVINGAPARTMENTS_MEDI        0
LIVINGAPARTMENTS_MODE           0
LIVINGAPARTMENTS_AVG            0
LIVINGAPARTMENTS_MEDI           0
FLOORSMIN_AVG                   0
FLOORSMIN_MODE                  0
FLOORSMIN_MEDI                  0
YEARS_BUILD_MEDI                0
YEARS_BUILD_MODE                0
YEARS_BUILD_AVG                 0
LANDAREA_MEDI                   0
LANDAREA_MODE                   0
LANDAREA_AVG                    0
BASEMENTAREA_MEDI               0
BASEMENTAREA_AVG                0
BASEMENTAREA_MODE               0
NONLIVINGAREA_MODE              0
NONLIVINGAREA_AVG               0
NONLIVINGAREA_MEDI              0
ELEVATORS_MEDI                  0
ELEVATORS_AVG                   0
ELEVATORS_MODE                  0
APARTMENTS_MEDI                 0
APARTMENTS_AVG                  0
APARTMENTS_MODE                 0
ENTRANCES_MEDI                  0
ENTRANCES_AVG                   0
ENTRANCES_MODE                  0
LIVINGAREA_AVG                  0
LIVINGAREA_MODE                 0
LIVINGAREA_MEDI                 0
FLOORSMAX_MODE                  0
FLOORSMAX_MEDI                  0
FLOORSMAX_AVG                   0
YEARS_BEGINEXPLUATATION_MODE    0
YEARS_BEGINEXPLUATATION_MEDI    0
YEARS_BEGINEXPLUATATION_AVG     0
TOTALAREA_MODE                  0
AMT_REQ_CREDIT_BUREAU_HOUR      0
AMT_REQ_CREDIT_BUREAU_DAY       0
AMT_REQ_CREDIT_BUREAU_WEEK      0
AMT_REQ_CREDIT_BUREAU_MON       0
AMT_REQ_CREDIT_BUREAU_QRT       0
AMT_REQ_CREDIT_BUREAU_YEAR      0
AMT_GOODS_PRICE                 0
AMT_ANNUITY                     0
CNT_FAM_MEMBERS                 0
DAYS_LAST_PHONE_CHANGE          0
AMT_CREDIT                      0
AMT_INCOME_TOTAL                0
DAYS_ID_PUBLISH                 0
DAYS_REGISTRATION               0
DAYS_EMPLOYED                   0
DAYS_BIRTH                      0
REGION_POPULATION_RELATIVE      0
SK_ID_CURR                      0
dtype: int64
In [61]:
list_vars_to_impute
Out[61]:
['COMMONAREA_MEDI',
 'COMMONAREA_AVG',
 'COMMONAREA_MODE',
 'NONLIVINGAPARTMENTS_MODE',
 'NONLIVINGAPARTMENTS_AVG',
 'NONLIVINGAPARTMENTS_MEDI',
 'LIVINGAPARTMENTS_MODE',
 'LIVINGAPARTMENTS_AVG',
 'LIVINGAPARTMENTS_MEDI',
 'FLOORSMIN_AVG',
 'FLOORSMIN_MODE',
 'FLOORSMIN_MEDI',
 'YEARS_BUILD_MEDI',
 'YEARS_BUILD_MODE',
 'YEARS_BUILD_AVG',
 'LANDAREA_MEDI',
 'LANDAREA_MODE',
 'LANDAREA_AVG',
 'BASEMENTAREA_MEDI',
 'BASEMENTAREA_AVG',
 'BASEMENTAREA_MODE',
 'NONLIVINGAREA_MODE',
 'NONLIVINGAREA_AVG',
 'NONLIVINGAREA_MEDI',
 'ELEVATORS_MEDI',
 'ELEVATORS_AVG',
 'ELEVATORS_MODE',
 'APARTMENTS_MEDI',
 'APARTMENTS_AVG',
 'APARTMENTS_MODE',
 'ENTRANCES_MEDI',
 'ENTRANCES_AVG',
 'ENTRANCES_MODE',
 'LIVINGAREA_AVG',
 'LIVINGAREA_MODE',
 'LIVINGAREA_MEDI',
 'FLOORSMAX_MODE',
 'FLOORSMAX_MEDI',
 'FLOORSMAX_AVG',
 'YEARS_BEGINEXPLUATATION_MODE',
 'YEARS_BEGINEXPLUATATION_MEDI',
 'YEARS_BEGINEXPLUATATION_AVG',
 'TOTALAREA_MODE',
 'AMT_REQ_CREDIT_BUREAU_HOUR',
 'AMT_REQ_CREDIT_BUREAU_DAY',
 'AMT_REQ_CREDIT_BUREAU_WEEK',
 'AMT_REQ_CREDIT_BUREAU_MON',
 'AMT_REQ_CREDIT_BUREAU_QRT',
 'AMT_REQ_CREDIT_BUREAU_YEAR',
 'AMT_GOODS_PRICE',
 'AMT_ANNUITY',
 'CNT_FAM_MEMBERS',
 'DAYS_LAST_PHONE_CHANGE',
 'AMT_CREDIT',
 'AMT_INCOME_TOTAL',
 'DAYS_ID_PUBLISH',
 'DAYS_REGISTRATION',
 'DAYS_EMPLOYED',
 'DAYS_BIRTH',
 'REGION_POPULATION_RELATIVE',
 'SK_ID_CURR']
In [63]:
print(df_application_train.columns)
Index(['COMMONAREA_MEDI', 'COMMONAREA_AVG', 'COMMONAREA_MODE',
       'NONLIVINGAPARTMENTS_MODE', 'NONLIVINGAPARTMENTS_AVG',
       'NONLIVINGAPARTMENTS_MEDI', 'FONDKAPREMONT_MODE',
       'LIVINGAPARTMENTS_MODE', 'LIVINGAPARTMENTS_AVG',
       'LIVINGAPARTMENTS_MEDI',
       ...
       'DAYS_REGISTRATION', 'DAYS_EMPLOYED', 'DAYS_BIRTH',
       'REGION_POPULATION_RELATIVE', 'NAME_HOUSING_TYPE', 'NAME_FAMILY_STATUS',
       'NAME_EDUCATION_TYPE', 'NAME_INCOME_TYPE', 'SK_ID_CURR', 'TARGET'],
      dtype='object', length=122)
In [65]:
print(df_application_test.columns)
Index(['COMMONAREA_MEDI', 'COMMONAREA_AVG', 'COMMONAREA_MODE',
       'NONLIVINGAPARTMENTS_MODE', 'NONLIVINGAPARTMENTS_AVG',
       'NONLIVINGAPARTMENTS_MEDI', 'FONDKAPREMONT_MODE',
       'LIVINGAPARTMENTS_MODE', 'LIVINGAPARTMENTS_AVG',
       'LIVINGAPARTMENTS_MEDI',
       ...
       'DAYS_REGISTRATION', 'DAYS_EMPLOYED', 'DAYS_BIRTH',
       'REGION_POPULATION_RELATIVE', 'NAME_HOUSING_TYPE', 'NAME_FAMILY_STATUS',
       'NAME_EDUCATION_TYPE', 'NAME_INCOME_TYPE', 'SK_ID_CURR', 'TARGET'],
      dtype='object', length=122)

¿Por Qué Imputar en Ambos Conjuntos (Train y Test)?¶

Coherencia de Datos: Si imputas valores nulos en el conjunto de entrenamiento pero no en el de prueba, puedes introducir inconsistencias entre los dos conjuntos, lo que podría afectar la performance del modelo. La idea es que ambos conjuntos de datos deben pasar por el mismo proceso de preprocesamiento para asegurar que las distribuciones de datos sean coherentes.

Mismas Transformaciones: Las mismas transformaciones que aplicas al conjunto de entrenamiento deben aplicarse al conjunto de prueba para que el modelo pueda hacer predicciones correctamente. Esto incluye cualquier tipo de escalado, imputación, codificación de variables, etc.

Tratamiento de las variables categoricas¶

Para calcular la correlación de Spearman, es imprescindible convertir las variables categóricas en numéricas. Esta conversión permite medir la relación entre estas variables mediante coeficientes de correlación.

En primer lugar, se aplicará el coeficiente V de Cramer. Este método es útil para evaluar la asociación entre variables categóricas y permite una mejor comprensión de las interdependencias en el conjunto de datos. Para más detalles sobre la implementación de este método, puedes consultar este recurso en Stack Overflow: https://stackoverflow.com/questions/46498455/categorical-features-correlation

Esta aproximación garantiza que las variables categóricas sean adecuadamente preprocesadas para su análisis y posterior utilización en modelos predictivos.n

In [69]:
list_var_cat
Out[69]:
['FONDKAPREMONT_MODE',
 'WALLSMATERIAL_MODE',
 'HOUSETYPE_MODE',
 'EMERGENCYSTATE_MODE',
 'OCCUPATION_TYPE',
 'NAME_TYPE_SUITE',
 'CNT_CHILDREN',
 'FLAG_DOCUMENT_8',
 'NAME_CONTRACT_TYPE',
 'CODE_GENDER',
 'FLAG_OWN_CAR',
 'FLAG_DOCUMENT_2',
 'FLAG_DOCUMENT_3',
 'FLAG_DOCUMENT_4',
 'FLAG_DOCUMENT_5',
 'FLAG_DOCUMENT_6',
 'FLAG_DOCUMENT_7',
 'FLAG_DOCUMENT_9',
 'FLAG_DOCUMENT_21',
 'FLAG_DOCUMENT_10',
 'FLAG_DOCUMENT_11',
 'FLAG_OWN_REALTY',
 'FLAG_DOCUMENT_13',
 'FLAG_DOCUMENT_14',
 'FLAG_DOCUMENT_15',
 'FLAG_DOCUMENT_16',
 'FLAG_DOCUMENT_17',
 'FLAG_DOCUMENT_18',
 'FLAG_DOCUMENT_19',
 'FLAG_DOCUMENT_20',
 'FLAG_DOCUMENT_12',
 'FLAG_PHONE',
 'LIVE_CITY_NOT_WORK_CITY',
 'REG_CITY_NOT_WORK_CITY',
 'TARGET',
 'REG_CITY_NOT_LIVE_CITY',
 'LIVE_REGION_NOT_WORK_REGION',
 'REG_REGION_NOT_WORK_REGION',
 'REG_REGION_NOT_LIVE_REGION',
 'HOUR_APPR_PROCESS_START',
 'WEEKDAY_APPR_PROCESS_START',
 'REGION_RATING_CLIENT_W_CITY',
 'REGION_RATING_CLIENT',
 'FLAG_EMAIL',
 'FLAG_CONT_MOBILE',
 'ORGANIZATION_TYPE',
 'FLAG_WORK_PHONE',
 'FLAG_EMP_PHONE',
 'FLAG_MOBIL',
 'NAME_HOUSING_TYPE',
 'NAME_FAMILY_STATUS',
 'NAME_EDUCATION_TYPE',
 'NAME_INCOME_TYPE']

Coeficiente V de Cramer¶

In [72]:
import numpy as np
import pandas as pd
from scipy.stats import chi2_contingency

def cramers_v(x, y):
    """ Calcular el coeficiente V de Cramer para la asociación entre dos variables categóricas """
    # Remover valores nulos
    x = x.dropna()
    y = y.dropna()
    
    # Solo calcular si ambas variables tienen datos
    if x.empty or y.empty:
        return np.nan
    
    confusion_matrix = pd.crosstab(x, y)
    if confusion_matrix.shape[0] == 1 or confusion_matrix.shape[1] == 1:
        return np.nan
    
    chi2 = chi2_contingency(confusion_matrix)[0]
    n = confusion_matrix.sum().sum()
    return np.sqrt(chi2 / (n * (min(confusion_matrix.shape) - 1)))

# Calcular V de Cramer por lotes de 2 en 2
lote_size = 2
for i in range(0, len(list_var_cat), lote_size):
    current_vars = list_var_cat[i:i + lote_size]
    cramers_v_matrix = pd.DataFrame(index=current_vars, columns=current_vars)
    for var1 in current_vars:
        for var2 in current_vars:
            if var1 == var2:
                cramers_v_matrix.loc[var1, var2] = 1.0
            else:
                # Combinar los datos y eliminar filas con NaN
                combined = pd.concat([df_application_input_train[var1], df_application_input_train[var2]], axis=1).dropna()
                if combined.empty or combined[var1].nunique() < 2 or combined[var2].nunique() < 2:
                    cramers_v_matrix.loc[var1, var2] = np.nan
                else:
                    cramers_v_matrix.loc[var1, var2] = cramers_v(combined[var1], combined[var2])

    # Convertir a tipo numérico
    cramers_v_matrix = cramers_v_matrix.astype(float)

    # Visualizar la matriz del lote actual
    print(f"Matriz de V de Cramer para el lote {i // lote_size + 1}:")
    print(cramers_v_matrix)
Matriz de V de Cramer para el lote 1:
                    FONDKAPREMONT_MODE  WALLSMATERIAL_MODE
FONDKAPREMONT_MODE            1.000000            0.108164
WALLSMATERIAL_MODE            0.108164            1.000000
Matriz de V de Cramer para el lote 2:
                     HOUSETYPE_MODE  EMERGENCYSTATE_MODE
HOUSETYPE_MODE             1.000000             0.034749
EMERGENCYSTATE_MODE        0.034749             1.000000
Matriz de V de Cramer para el lote 3:
                 OCCUPATION_TYPE  NAME_TYPE_SUITE
OCCUPATION_TYPE         1.000000         0.023537
NAME_TYPE_SUITE         0.023537         1.000000
Matriz de V de Cramer para el lote 4:
                 CNT_CHILDREN  FLAG_DOCUMENT_8
CNT_CHILDREN         1.000000         0.057721
FLAG_DOCUMENT_8      0.057721         1.000000
Matriz de V de Cramer para el lote 5:
                    NAME_CONTRACT_TYPE  CODE_GENDER
NAME_CONTRACT_TYPE            1.000000     0.013234
CODE_GENDER                   0.013234     1.000000
Matriz de V de Cramer para el lote 6:
                 FLAG_OWN_CAR  FLAG_DOCUMENT_2
FLAG_OWN_CAR         1.000000         0.000305
FLAG_DOCUMENT_2      0.000305         1.000000
Matriz de V de Cramer para el lote 7:
                 FLAG_DOCUMENT_3  FLAG_DOCUMENT_4
FLAG_DOCUMENT_3         1.000000         0.014649
FLAG_DOCUMENT_4         0.014649         1.000000
Matriz de V de Cramer para el lote 8:
                 FLAG_DOCUMENT_5  FLAG_DOCUMENT_6
FLAG_DOCUMENT_5         1.000000         0.038735
FLAG_DOCUMENT_6         0.038735         1.000000
Matriz de V de Cramer para el lote 9:
                 FLAG_DOCUMENT_7  FLAG_DOCUMENT_9
FLAG_DOCUMENT_7              1.0              0.0
FLAG_DOCUMENT_9              0.0              1.0
Matriz de V de Cramer para el lote 10:
                  FLAG_DOCUMENT_21  FLAG_DOCUMENT_10
FLAG_DOCUMENT_21               1.0               0.0
FLAG_DOCUMENT_10               0.0               1.0
Matriz de V de Cramer para el lote 11:
                  FLAG_DOCUMENT_11  FLAG_OWN_REALTY
FLAG_DOCUMENT_11          1.000000         0.034342
FLAG_OWN_REALTY           0.034342         1.000000
Matriz de V de Cramer para el lote 12:
                  FLAG_DOCUMENT_13  FLAG_DOCUMENT_14
FLAG_DOCUMENT_13          1.000000          0.002551
FLAG_DOCUMENT_14          0.002551          1.000000
Matriz de V de Cramer para el lote 13:
                  FLAG_DOCUMENT_15  FLAG_DOCUMENT_16
FLAG_DOCUMENT_15          1.000000          0.002827
FLAG_DOCUMENT_16          0.002827          1.000000
Matriz de V de Cramer para el lote 14:
                  FLAG_DOCUMENT_17  FLAG_DOCUMENT_18
FLAG_DOCUMENT_17               1.0               0.0
FLAG_DOCUMENT_18               0.0               1.0
Matriz de V de Cramer para el lote 15:
                  FLAG_DOCUMENT_19  FLAG_DOCUMENT_20
FLAG_DOCUMENT_19          1.000000          0.018176
FLAG_DOCUMENT_20          0.018176          1.000000
Matriz de V de Cramer para el lote 16:
                  FLAG_DOCUMENT_12  FLAG_PHONE
FLAG_DOCUMENT_12          1.000000    0.000198
FLAG_PHONE                0.000198    1.000000
Matriz de V de Cramer para el lote 17:
                         LIVE_CITY_NOT_WORK_CITY  REG_CITY_NOT_WORK_CITY
LIVE_CITY_NOT_WORK_CITY                 1.000000                0.825153
REG_CITY_NOT_WORK_CITY                  0.825153                1.000000
Matriz de V de Cramer para el lote 18:
                          TARGET  REG_CITY_NOT_LIVE_CITY
TARGET                  1.000000                0.041644
REG_CITY_NOT_LIVE_CITY  0.041644                1.000000
Matriz de V de Cramer para el lote 19:
                             LIVE_REGION_NOT_WORK_REGION  \
LIVE_REGION_NOT_WORK_REGION                     1.000000   
REG_REGION_NOT_WORK_REGION                      0.859723   

                             REG_REGION_NOT_WORK_REGION  
LIVE_REGION_NOT_WORK_REGION                    0.859723  
REG_REGION_NOT_WORK_REGION                     1.000000  
Matriz de V de Cramer para el lote 20:
                            REG_REGION_NOT_LIVE_REGION  \
REG_REGION_NOT_LIVE_REGION                    1.000000   
HOUR_APPR_PROCESS_START                       0.061884   

                            HOUR_APPR_PROCESS_START  
REG_REGION_NOT_LIVE_REGION                 0.061884  
HOUR_APPR_PROCESS_START                    1.000000  
Matriz de V de Cramer para el lote 21:
                             WEEKDAY_APPR_PROCESS_START  \
WEEKDAY_APPR_PROCESS_START                     1.000000   
REGION_RATING_CLIENT_W_CITY                    0.017773   

                             REGION_RATING_CLIENT_W_CITY  
WEEKDAY_APPR_PROCESS_START                      0.017773  
REGION_RATING_CLIENT_W_CITY                     1.000000  
Matriz de V de Cramer para el lote 22:
                      REGION_RATING_CLIENT  FLAG_EMAIL
REGION_RATING_CLIENT              1.000000    0.065856
FLAG_EMAIL                        0.065856    1.000000
Matriz de V de Cramer para el lote 23:
                   FLAG_CONT_MOBILE  ORGANIZATION_TYPE
FLAG_CONT_MOBILE           1.000000           0.025672
ORGANIZATION_TYPE          0.025672           1.000000
Matriz de V de Cramer para el lote 24:
                 FLAG_WORK_PHONE  FLAG_EMP_PHONE
FLAG_WORK_PHONE         1.000000        0.233879
FLAG_EMP_PHONE          0.233879        1.000000
Matriz de V de Cramer para el lote 25:
                   FLAG_MOBIL  NAME_HOUSING_TYPE
FLAG_MOBIL           1.000000           0.000718
NAME_HOUSING_TYPE    0.000718           1.000000
Matriz de V de Cramer para el lote 26:
                     NAME_FAMILY_STATUS  NAME_EDUCATION_TYPE
NAME_FAMILY_STATUS              1.00000              0.05282
NAME_EDUCATION_TYPE             0.05282              1.00000
Matriz de V de Cramer para el lote 27:
                  NAME_INCOME_TYPE
NAME_INCOME_TYPE               1.0

Principales resultados:¶

  • Relación entre Variables Categóricas: A partir de los cálculos del coeficiente V de Cramer, se puede observar que la mayoría de las asociaciones entre variables categóricas son bastante débiles, con coeficientes generalmente bajos, como por ejemplo, HOUSETYPE_MODE y EMERGENCYSTATE_MODE con un valor de 0.033394. Esto sugiere que no hay una fuerte relación entre muchas de las variables categóricas en el conjunto de datos, lo cual puede ser interpretado como una indicación de independencia entre estas variables.

  • Identificación de Relaciones Significativas: Sin embargo, algunas combinaciones muestran una asociación más fuerte, como LIVE_CITY_NOT_WORK_CITY y REG_CITY_NOT_WORK_CITY con un coeficiente de 0.824967, lo que indica una relación significativa entre estas variables. Este resultado es lógico, ya que es probable que las personas que viven en la misma ciudad en la que trabajan también registren su residencia en esa ciudad. Otro ejemplo es LIVE_REGION_NOT_WORK_REGION y REG_REGION_NOT_WORK_REGION con un valor de 0.861444, lo que refuerza la importancia de considerar estas asociaciones durante el análisis y modelado.

In [79]:
# Mostrar los primeros valores de las columnas categóricas
for col in list_var_cat:
    print(f"Valores únicos en la columna '{col}':")
    print(df_application_input_train[col].unique())
    print("\n")
Valores únicos en la columna 'FONDKAPREMONT_MODE':
['reg oper account', NaN, 'reg oper spec account', 'not specified', 'org spec account']
Categories (4, object): ['reg oper account', 'reg oper spec account', 'not specified', 'org spec account']


Valores únicos en la columna 'WALLSMATERIAL_MODE':
['Stone, brick', 'Block', 'Panel', NaN, 'Mixed', 'Others', 'Wooden', 'Monolithic']
Categories (7, object): ['Stone, brick', 'Block', 'Panel', 'Mixed', 'Others', 'Wooden', 'Monolithic']


Valores únicos en la columna 'HOUSETYPE_MODE':
['block of flats', NaN, 'terraced house', 'specific housing']
Categories (3, object): ['block of flats', 'terraced house', 'specific housing']


Valores únicos en la columna 'EMERGENCYSTATE_MODE':
['No', NaN, 'Yes']
Categories (2, object): ['No', 'Yes']


Valores únicos en la columna 'OCCUPATION_TYPE':
['Managers', 'High skill tech staff', 'Medicine staff', 'Drivers', NaN, ..., 'Waiters/barmen staff', 'IT staff', 'Secretaries', 'Low-skill Laborers', 'HR staff']
Length: 19
Categories (18, object): ['Managers', 'High skill tech staff', 'Medicine staff', 'Drivers', ..., 'IT staff', 'Secretaries', 'Low-skill Laborers', 'HR staff']


Valores únicos en la columna 'NAME_TYPE_SUITE':
['Unaccompanied', 'Spouse, partner', 'Family', 'Group of people', 'Other_A', 'Other_B', 'Children', NaN]
Categories (7, object): ['Unaccompanied', 'Spouse, partner', 'Family', 'Group of people', 'Other_A', 'Other_B', 'Children']


Valores únicos en la columna 'CNT_CHILDREN':
[1, 0, 2, 3, 4, ..., 8, 12, 9, 11, 19]
Length: 15
Categories (15, int64): [1, 0, 2, 3, ..., 12, 9, 11, 19]


Valores únicos en la columna 'FLAG_DOCUMENT_8':
[0, 1]
Categories (2, int64): [0, 1]


Valores únicos en la columna 'NAME_CONTRACT_TYPE':
['Cash loans', 'Revolving loans']
Categories (2, object): ['Cash loans', 'Revolving loans']


Valores únicos en la columna 'CODE_GENDER':
['F', 'M', 'XNA']
Categories (3, object): ['F', 'M', 'XNA']


Valores únicos en la columna 'FLAG_OWN_CAR':
['Y', 'N']
Categories (2, object): ['Y', 'N']


Valores únicos en la columna 'FLAG_DOCUMENT_2':
[0, 1]
Categories (2, int64): [0, 1]


Valores únicos en la columna 'FLAG_DOCUMENT_3':
[1, 0]
Categories (2, int64): [1, 0]


Valores únicos en la columna 'FLAG_DOCUMENT_4':
[0, 1]
Categories (2, int64): [0, 1]


Valores únicos en la columna 'FLAG_DOCUMENT_5':
[0, 1]
Categories (2, int64): [0, 1]


Valores únicos en la columna 'FLAG_DOCUMENT_6':
[0, 1]
Categories (2, int64): [0, 1]


Valores únicos en la columna 'FLAG_DOCUMENT_7':
[0, 1]
Categories (2, int64): [0, 1]


Valores únicos en la columna 'FLAG_DOCUMENT_9':
[0, 1]
Categories (2, int64): [0, 1]


Valores únicos en la columna 'FLAG_DOCUMENT_21':
[0, 1]
Categories (2, int64): [0, 1]


Valores únicos en la columna 'FLAG_DOCUMENT_10':
[0, 1]
Categories (2, int64): [0, 1]


Valores únicos en la columna 'FLAG_DOCUMENT_11':
[0, 1]
Categories (2, int64): [0, 1]


Valores únicos en la columna 'FLAG_OWN_REALTY':
['Y', 'N']
Categories (2, object): ['Y', 'N']


Valores únicos en la columna 'FLAG_DOCUMENT_13':
[0, 1]
Categories (2, int64): [0, 1]


Valores únicos en la columna 'FLAG_DOCUMENT_14':
[0, 1]
Categories (2, int64): [0, 1]


Valores únicos en la columna 'FLAG_DOCUMENT_15':
[0, 1]
Categories (2, int64): [0, 1]


Valores únicos en la columna 'FLAG_DOCUMENT_16':
[0, 1]
Categories (2, int64): [0, 1]


Valores únicos en la columna 'FLAG_DOCUMENT_17':
[0, 1]
Categories (2, int64): [0, 1]


Valores únicos en la columna 'FLAG_DOCUMENT_18':
[0, 1]
Categories (2, int64): [0, 1]


Valores únicos en la columna 'FLAG_DOCUMENT_19':
[0, 1]
Categories (2, int64): [0, 1]


Valores únicos en la columna 'FLAG_DOCUMENT_20':
[0, 1]
Categories (2, int64): [0, 1]


Valores únicos en la columna 'FLAG_DOCUMENT_12':
[0, 1]
Categories (2, int64): [0, 1]


Valores únicos en la columna 'FLAG_PHONE':
[0, 1]
Categories (2, int64): [0, 1]


Valores únicos en la columna 'LIVE_CITY_NOT_WORK_CITY':
[0, 1]
Categories (2, int64): [0, 1]


Valores únicos en la columna 'REG_CITY_NOT_WORK_CITY':
[0, 1]
Categories (2, int64): [0, 1]


Valores únicos en la columna 'TARGET':
[1, 0]
Categories (2, int64): [1, 0]


Valores únicos en la columna 'REG_CITY_NOT_LIVE_CITY':
[0, 1]
Categories (2, int64): [0, 1]


Valores únicos en la columna 'LIVE_REGION_NOT_WORK_REGION':
[0, 1]
Categories (2, int64): [0, 1]


Valores únicos en la columna 'REG_REGION_NOT_WORK_REGION':
[0, 1]
Categories (2, int64): [0, 1]


Valores únicos en la columna 'REG_REGION_NOT_LIVE_REGION':
[0, 1]
Categories (2, int64): [0, 1]


Valores únicos en la columna 'HOUR_APPR_PROCESS_START':
[7, 11, 18, 10, 5, ..., 2, 22, 1, 0, 23]
Length: 24
Categories (24, int64): [7, 11, 18, 10, ..., 22, 1, 0, 23]


Valores únicos en la columna 'WEEKDAY_APPR_PROCESS_START':
['FRIDAY', 'MONDAY', 'WEDNESDAY', 'THURSDAY', 'SATURDAY', 'SUNDAY', 'TUESDAY']
Categories (7, object): ['FRIDAY', 'MONDAY', 'WEDNESDAY', 'THURSDAY', 'SATURDAY', 'SUNDAY', 'TUESDAY']


Valores únicos en la columna 'REGION_RATING_CLIENT_W_CITY':
[2, 1, 3]
Categories (3, int64): [2, 1, 3]


Valores únicos en la columna 'REGION_RATING_CLIENT':
[2, 1, 3]
Categories (3, int64): [2, 1, 3]


Valores únicos en la columna 'FLAG_EMAIL':
[0, 1]
Categories (2, int64): [0, 1]


Valores únicos en la columna 'FLAG_CONT_MOBILE':
[1, 0]
Categories (2, int64): [1, 0]


Valores únicos en la columna 'ORGANIZATION_TYPE':
['Business Entity Type 3', 'Self-employed', 'Medicine', 'Military', 'XNA', ..., 'Trade: type 4', 'Industry: type 13', 'Trade: type 5', 'Industry: type 8', 'Religion']
Length: 58
Categories (58, object): ['Business Entity Type 3', 'Self-employed', 'Medicine', 'Military', ..., 'Industry: type 13', 'Trade: type 5', 'Industry: type 8', 'Religion']


Valores únicos en la columna 'FLAG_WORK_PHONE':
[0, 1]
Categories (2, int64): [0, 1]


Valores únicos en la columna 'FLAG_EMP_PHONE':
[1, 0]
Categories (2, int64): [1, 0]


Valores únicos en la columna 'FLAG_MOBIL':
[1, 0]
Categories (2, int64): [1, 0]


Valores únicos en la columna 'NAME_HOUSING_TYPE':
['House / apartment', 'Office apartment', 'Rented apartment', 'Municipal apartment', 'With parents', 'Co-op apartment']
Categories (6, object): ['House / apartment', 'Office apartment', 'Rented apartment', 'Municipal apartment', 'With parents', 'Co-op apartment']


Valores únicos en la columna 'NAME_FAMILY_STATUS':
['Married', 'Single / not married', 'Civil marriage', 'Widow', 'Separated', 'Unknown']
Categories (6, object): ['Married', 'Single / not married', 'Civil marriage', 'Widow', 'Separated', 'Unknown']


Valores únicos en la columna 'NAME_EDUCATION_TYPE':
['Secondary / secondary special', 'Higher education', 'Incomplete higher', 'Lower secondary', 'Academic degree']
Categories (5, object): ['Secondary / secondary special', 'Higher education', 'Incomplete higher', 'Lower secondary', 'Academic degree']


Valores únicos en la columna 'NAME_INCOME_TYPE':
['Working', 'State servant', 'Pensioner', 'Commercial associate', 'Student', 'Unemployed', 'Businessman', 'Maternity leave']
Categories (8, object): ['Working', 'State servant', 'Pensioner', 'Commercial associate', 'Student', 'Unemployed', 'Businessman', 'Maternity leave']


In [75]:
# Verificar la cantidad de valores nulos en las variables categóricas
print("Valores nulos en las variables categóricas:")
print(df_application_input_train[list_var_cat].isnull().sum())

# Verificar la cantidad de valores no nulos en las variables categóricas
print("Valores no nulos en las variables categóricas:")
print(df_application_input_train[list_var_cat].notnull().sum())
Valores nulos en las variables categóricas:
FONDKAPREMONT_MODE             168176
WALLSMATERIAL_MODE             125067
HOUSETYPE_MODE                 123436
EMERGENCYSTATE_MODE            116585
OCCUPATION_TYPE                 77233
NAME_TYPE_SUITE                  1019
CNT_CHILDREN                        0
FLAG_DOCUMENT_8                     0
NAME_CONTRACT_TYPE                  0
CODE_GENDER                         0
FLAG_OWN_CAR                        0
FLAG_DOCUMENT_2                     0
FLAG_DOCUMENT_3                     0
FLAG_DOCUMENT_4                     0
FLAG_DOCUMENT_5                     0
FLAG_DOCUMENT_6                     0
FLAG_DOCUMENT_7                     0
FLAG_DOCUMENT_9                     0
FLAG_DOCUMENT_21                    0
FLAG_DOCUMENT_10                    0
FLAG_DOCUMENT_11                    0
FLAG_OWN_REALTY                     0
FLAG_DOCUMENT_13                    0
FLAG_DOCUMENT_14                    0
FLAG_DOCUMENT_15                    0
FLAG_DOCUMENT_16                    0
FLAG_DOCUMENT_17                    0
FLAG_DOCUMENT_18                    0
FLAG_DOCUMENT_19                    0
FLAG_DOCUMENT_20                    0
FLAG_DOCUMENT_12                    0
FLAG_PHONE                          0
LIVE_CITY_NOT_WORK_CITY             0
REG_CITY_NOT_WORK_CITY              0
TARGET                              0
REG_CITY_NOT_LIVE_CITY              0
LIVE_REGION_NOT_WORK_REGION         0
REG_REGION_NOT_WORK_REGION          0
REG_REGION_NOT_LIVE_REGION          0
HOUR_APPR_PROCESS_START             0
WEEKDAY_APPR_PROCESS_START          0
REGION_RATING_CLIENT_W_CITY         0
REGION_RATING_CLIENT                0
FLAG_EMAIL                          0
FLAG_CONT_MOBILE                    0
ORGANIZATION_TYPE                   0
FLAG_WORK_PHONE                     0
FLAG_EMP_PHONE                      0
FLAG_MOBIL                          0
NAME_HOUSING_TYPE                   0
NAME_FAMILY_STATUS                  0
NAME_EDUCATION_TYPE                 0
NAME_INCOME_TYPE                    0
dtype: int64
Valores no nulos en las variables categóricas:
FONDKAPREMONT_MODE              77832
WALLSMATERIAL_MODE             120941
HOUSETYPE_MODE                 122572
EMERGENCYSTATE_MODE            129423
OCCUPATION_TYPE                168775
NAME_TYPE_SUITE                244989
CNT_CHILDREN                   246008
FLAG_DOCUMENT_8                246008
NAME_CONTRACT_TYPE             246008
CODE_GENDER                    246008
FLAG_OWN_CAR                   246008
FLAG_DOCUMENT_2                246008
FLAG_DOCUMENT_3                246008
FLAG_DOCUMENT_4                246008
FLAG_DOCUMENT_5                246008
FLAG_DOCUMENT_6                246008
FLAG_DOCUMENT_7                246008
FLAG_DOCUMENT_9                246008
FLAG_DOCUMENT_21               246008
FLAG_DOCUMENT_10               246008
FLAG_DOCUMENT_11               246008
FLAG_OWN_REALTY                246008
FLAG_DOCUMENT_13               246008
FLAG_DOCUMENT_14               246008
FLAG_DOCUMENT_15               246008
FLAG_DOCUMENT_16               246008
FLAG_DOCUMENT_17               246008
FLAG_DOCUMENT_18               246008
FLAG_DOCUMENT_19               246008
FLAG_DOCUMENT_20               246008
FLAG_DOCUMENT_12               246008
FLAG_PHONE                     246008
LIVE_CITY_NOT_WORK_CITY        246008
REG_CITY_NOT_WORK_CITY         246008
TARGET                         246008
REG_CITY_NOT_LIVE_CITY         246008
LIVE_REGION_NOT_WORK_REGION    246008
REG_REGION_NOT_WORK_REGION     246008
REG_REGION_NOT_LIVE_REGION     246008
HOUR_APPR_PROCESS_START        246008
WEEKDAY_APPR_PROCESS_START     246008
REGION_RATING_CLIENT_W_CITY    246008
REGION_RATING_CLIENT           246008
FLAG_EMAIL                     246008
FLAG_CONT_MOBILE               246008
ORGANIZATION_TYPE              246008
FLAG_WORK_PHONE                246008
FLAG_EMP_PHONE                 246008
FLAG_MOBIL                     246008
NAME_HOUSING_TYPE              246008
NAME_FAMILY_STATUS             246008
NAME_EDUCATION_TYPE            246008
NAME_INCOME_TYPE               246008
dtype: int64
In [77]:
# Verificar la cantidad de valores nulos en las variables categóricas
print("Valores nulos en las variables categóricas:")
print(df_application_input_test[list_var_cat].isnull().sum())

# Verificar la cantidad de valores no nulos en las variables categóricas
print("Valores no nulos en las variables categóricas:")
print(df_application_input_test[list_var_cat].notnull().sum())
Valores nulos en las variables categóricas:
FONDKAPREMONT_MODE             42119
WALLSMATERIAL_MODE             31274
HOUSETYPE_MODE                 30861
EMERGENCYSTATE_MODE            29170
OCCUPATION_TYPE                19158
NAME_TYPE_SUITE                  273
CNT_CHILDREN                       0
FLAG_DOCUMENT_8                    0
NAME_CONTRACT_TYPE                 0
CODE_GENDER                        0
FLAG_OWN_CAR                       0
FLAG_DOCUMENT_2                    0
FLAG_DOCUMENT_3                    0
FLAG_DOCUMENT_4                    0
FLAG_DOCUMENT_5                    0
FLAG_DOCUMENT_6                    0
FLAG_DOCUMENT_7                    0
FLAG_DOCUMENT_9                    0
FLAG_DOCUMENT_21                   0
FLAG_DOCUMENT_10                   0
FLAG_DOCUMENT_11                   0
FLAG_OWN_REALTY                    0
FLAG_DOCUMENT_13                   0
FLAG_DOCUMENT_14                   0
FLAG_DOCUMENT_15                   0
FLAG_DOCUMENT_16                   0
FLAG_DOCUMENT_17                   0
FLAG_DOCUMENT_18                   0
FLAG_DOCUMENT_19                   0
FLAG_DOCUMENT_20                   0
FLAG_DOCUMENT_12                   0
FLAG_PHONE                         0
LIVE_CITY_NOT_WORK_CITY            0
REG_CITY_NOT_WORK_CITY             0
TARGET                             0
REG_CITY_NOT_LIVE_CITY             0
LIVE_REGION_NOT_WORK_REGION        0
REG_REGION_NOT_WORK_REGION         0
REG_REGION_NOT_LIVE_REGION         0
HOUR_APPR_PROCESS_START            0
WEEKDAY_APPR_PROCESS_START         0
REGION_RATING_CLIENT_W_CITY        0
REGION_RATING_CLIENT               0
FLAG_EMAIL                         0
FLAG_CONT_MOBILE                   0
ORGANIZATION_TYPE                  0
FLAG_WORK_PHONE                    0
FLAG_EMP_PHONE                     0
FLAG_MOBIL                         0
NAME_HOUSING_TYPE                  0
NAME_FAMILY_STATUS                 0
NAME_EDUCATION_TYPE                0
NAME_INCOME_TYPE                   0
dtype: int64
Valores no nulos en las variables categóricas:
FONDKAPREMONT_MODE             19384
WALLSMATERIAL_MODE             30229
HOUSETYPE_MODE                 30642
EMERGENCYSTATE_MODE            32333
OCCUPATION_TYPE                42345
NAME_TYPE_SUITE                61230
CNT_CHILDREN                   61503
FLAG_DOCUMENT_8                61503
NAME_CONTRACT_TYPE             61503
CODE_GENDER                    61503
FLAG_OWN_CAR                   61503
FLAG_DOCUMENT_2                61503
FLAG_DOCUMENT_3                61503
FLAG_DOCUMENT_4                61503
FLAG_DOCUMENT_5                61503
FLAG_DOCUMENT_6                61503
FLAG_DOCUMENT_7                61503
FLAG_DOCUMENT_9                61503
FLAG_DOCUMENT_21               61503
FLAG_DOCUMENT_10               61503
FLAG_DOCUMENT_11               61503
FLAG_OWN_REALTY                61503
FLAG_DOCUMENT_13               61503
FLAG_DOCUMENT_14               61503
FLAG_DOCUMENT_15               61503
FLAG_DOCUMENT_16               61503
FLAG_DOCUMENT_17               61503
FLAG_DOCUMENT_18               61503
FLAG_DOCUMENT_19               61503
FLAG_DOCUMENT_20               61503
FLAG_DOCUMENT_12               61503
FLAG_PHONE                     61503
LIVE_CITY_NOT_WORK_CITY        61503
REG_CITY_NOT_WORK_CITY         61503
TARGET                         61503
REG_CITY_NOT_LIVE_CITY         61503
LIVE_REGION_NOT_WORK_REGION    61503
REG_REGION_NOT_WORK_REGION     61503
REG_REGION_NOT_LIVE_REGION     61503
HOUR_APPR_PROCESS_START        61503
WEEKDAY_APPR_PROCESS_START     61503
REGION_RATING_CLIENT_W_CITY    61503
REGION_RATING_CLIENT           61503
FLAG_EMAIL                     61503
FLAG_CONT_MOBILE               61503
ORGANIZATION_TYPE              61503
FLAG_WORK_PHONE                61503
FLAG_EMP_PHONE                 61503
FLAG_MOBIL                     61503
NAME_HOUSING_TYPE              61503
NAME_FAMILY_STATUS             61503
NAME_EDUCATION_TYPE            61503
NAME_INCOME_TYPE               61503
dtype: int64

Sustitución de valores nulos en variables categóricas¶

In [83]:
# Sustituir valores nulos por "SIN VALOR" en variables categóricas
df_application_input_train[list_var_cat] = df_application_input_train[list_var_cat].astype("object").fillna("SIN VALOR").astype("category")
df_application_input_test[list_var_cat] = df_application_input_test[list_var_cat].astype("object").fillna("SIN VALOR").astype("category")

# Verificar los resultados
print("Valores nulos en las variables categóricas del conjunto de entrenamiento:")
print(df_application_input_train[list_var_cat].isnull().sum())

print("Valores nulos en las variables categóricas del conjunto de prueba:")
print(df_application_input_test[list_var_cat].isnull().sum())
Valores nulos en las variables categóricas del conjunto de entrenamiento:
FONDKAPREMONT_MODE             0
WALLSMATERIAL_MODE             0
HOUSETYPE_MODE                 0
EMERGENCYSTATE_MODE            0
OCCUPATION_TYPE                0
NAME_TYPE_SUITE                0
CNT_CHILDREN                   0
FLAG_DOCUMENT_8                0
NAME_CONTRACT_TYPE             0
CODE_GENDER                    0
FLAG_OWN_CAR                   0
FLAG_DOCUMENT_2                0
FLAG_DOCUMENT_3                0
FLAG_DOCUMENT_4                0
FLAG_DOCUMENT_5                0
FLAG_DOCUMENT_6                0
FLAG_DOCUMENT_7                0
FLAG_DOCUMENT_9                0
FLAG_DOCUMENT_21               0
FLAG_DOCUMENT_10               0
FLAG_DOCUMENT_11               0
FLAG_OWN_REALTY                0
FLAG_DOCUMENT_13               0
FLAG_DOCUMENT_14               0
FLAG_DOCUMENT_15               0
FLAG_DOCUMENT_16               0
FLAG_DOCUMENT_17               0
FLAG_DOCUMENT_18               0
FLAG_DOCUMENT_19               0
FLAG_DOCUMENT_20               0
FLAG_DOCUMENT_12               0
FLAG_PHONE                     0
LIVE_CITY_NOT_WORK_CITY        0
REG_CITY_NOT_WORK_CITY         0
TARGET                         0
REG_CITY_NOT_LIVE_CITY         0
LIVE_REGION_NOT_WORK_REGION    0
REG_REGION_NOT_WORK_REGION     0
REG_REGION_NOT_LIVE_REGION     0
HOUR_APPR_PROCESS_START        0
WEEKDAY_APPR_PROCESS_START     0
REGION_RATING_CLIENT_W_CITY    0
REGION_RATING_CLIENT           0
FLAG_EMAIL                     0
FLAG_CONT_MOBILE               0
ORGANIZATION_TYPE              0
FLAG_WORK_PHONE                0
FLAG_EMP_PHONE                 0
FLAG_MOBIL                     0
NAME_HOUSING_TYPE              0
NAME_FAMILY_STATUS             0
NAME_EDUCATION_TYPE            0
NAME_INCOME_TYPE               0
dtype: int64
Valores nulos en las variables categóricas del conjunto de prueba:
FONDKAPREMONT_MODE             0
WALLSMATERIAL_MODE             0
HOUSETYPE_MODE                 0
EMERGENCYSTATE_MODE            0
OCCUPATION_TYPE                0
NAME_TYPE_SUITE                0
CNT_CHILDREN                   0
FLAG_DOCUMENT_8                0
NAME_CONTRACT_TYPE             0
CODE_GENDER                    0
FLAG_OWN_CAR                   0
FLAG_DOCUMENT_2                0
FLAG_DOCUMENT_3                0
FLAG_DOCUMENT_4                0
FLAG_DOCUMENT_5                0
FLAG_DOCUMENT_6                0
FLAG_DOCUMENT_7                0
FLAG_DOCUMENT_9                0
FLAG_DOCUMENT_21               0
FLAG_DOCUMENT_10               0
FLAG_DOCUMENT_11               0
FLAG_OWN_REALTY                0
FLAG_DOCUMENT_13               0
FLAG_DOCUMENT_14               0
FLAG_DOCUMENT_15               0
FLAG_DOCUMENT_16               0
FLAG_DOCUMENT_17               0
FLAG_DOCUMENT_18               0
FLAG_DOCUMENT_19               0
FLAG_DOCUMENT_20               0
FLAG_DOCUMENT_12               0
FLAG_PHONE                     0
LIVE_CITY_NOT_WORK_CITY        0
REG_CITY_NOT_WORK_CITY         0
TARGET                         0
REG_CITY_NOT_LIVE_CITY         0
LIVE_REGION_NOT_WORK_REGION    0
REG_REGION_NOT_WORK_REGION     0
REG_REGION_NOT_LIVE_REGION     0
HOUR_APPR_PROCESS_START        0
WEEKDAY_APPR_PROCESS_START     0
REGION_RATING_CLIENT_W_CITY    0
REGION_RATING_CLIENT           0
FLAG_EMAIL                     0
FLAG_CONT_MOBILE               0
ORGANIZATION_TYPE              0
FLAG_WORK_PHONE                0
FLAG_EMP_PHONE                 0
FLAG_MOBIL                     0
NAME_HOUSING_TYPE              0
NAME_FAMILY_STATUS             0
NAME_EDUCATION_TYPE            0
NAME_INCOME_TYPE               0
dtype: int64

Cuando se reemplazaron los valores nulos con "SIN VALOR", las columnas que antes tenían valores nulos ahora tienen un valor no nulo (específicamente el texto "SIN VALOR"). Así, el conteo de valores nulos se volvió 0 para esas columnas.

In [85]:
# Para comprobar

# Ver las primeras filas del conjunto de entrenamiento
print("Primeras filas del conjunto de entrenamiento:")
print(df_application_input_train[list_var_cat].head())

# Ver las primeras filas del conjunto de prueba
print("Primeras filas del conjunto de prueba:")
print(df_application_input_test[list_var_cat].head())
Primeras filas del conjunto de entrenamiento:
       FONDKAPREMONT_MODE WALLSMATERIAL_MODE  HOUSETYPE_MODE  \
47185    reg oper account       Stone, brick  block of flats   
133243          SIN VALOR              Block  block of flats   
259367   reg oper account              Panel  block of flats   
219323          SIN VALOR              Panel  block of flats   
256066          SIN VALOR          SIN VALOR       SIN VALOR   

       EMERGENCYSTATE_MODE        OCCUPATION_TYPE  NAME_TYPE_SUITE  \
47185                   No               Managers    Unaccompanied   
133243                  No  High skill tech staff    Unaccompanied   
259367                  No         Medicine staff    Unaccompanied   
219323                  No         Medicine staff    Unaccompanied   
256066           SIN VALOR                Drivers  Spouse, partner   

       CNT_CHILDREN FLAG_DOCUMENT_8 NAME_CONTRACT_TYPE CODE_GENDER  \
47185             1               0         Cash loans           F   
133243            0               0         Cash loans           F   
259367            0               0         Cash loans           F   
219323            0               0         Cash loans           F   
256066            0               1         Cash loans           M   

       FLAG_OWN_CAR FLAG_DOCUMENT_2 FLAG_DOCUMENT_3 FLAG_DOCUMENT_4  \
47185             Y               0               1               0   
133243            N               0               1               0   
259367            N               0               1               0   
219323            N               0               1               0   
256066            Y               0               0               0   

       FLAG_DOCUMENT_5 FLAG_DOCUMENT_6 FLAG_DOCUMENT_7 FLAG_DOCUMENT_9  \
47185                0               0               0               0   
133243               0               0               0               0   
259367               0               0               0               0   
219323               0               0               0               0   
256066               0               0               0               0   

       FLAG_DOCUMENT_21 FLAG_DOCUMENT_10 FLAG_DOCUMENT_11 FLAG_OWN_REALTY  \
47185                 0                0                0               Y   
133243                0                0                0               N   
259367                0                0                0               N   
219323                0                0                0               Y   
256066                0                0                0               N   

       FLAG_DOCUMENT_13 FLAG_DOCUMENT_14 FLAG_DOCUMENT_15 FLAG_DOCUMENT_16  \
47185                 0                0                0                0   
133243                0                0                0                0   
259367                0                0                0                0   
219323                0                0                0                0   
256066                0                0                0                0   

       FLAG_DOCUMENT_17 FLAG_DOCUMENT_18 FLAG_DOCUMENT_19 FLAG_DOCUMENT_20  \
47185                 0                0                0                0   
133243                0                0                0                0   
259367                0                0                0                0   
219323                0                0                0                0   
256066                0                0                0                0   

       FLAG_DOCUMENT_12 FLAG_PHONE LIVE_CITY_NOT_WORK_CITY  \
47185                 0          0                       0   
133243                0          0                       0   
259367                0          0                       0   
219323                0          0                       0   
256066                0          0                       0   

       REG_CITY_NOT_WORK_CITY TARGET REG_CITY_NOT_LIVE_CITY  \
47185                       0      1                      0   
133243                      0      0                      0   
259367                      0      0                      0   
219323                      1      0                      1   
256066                      1      0                      1   

       LIVE_REGION_NOT_WORK_REGION REG_REGION_NOT_WORK_REGION  \
47185                            0                          0   
133243                           0                          0   
259367                           0                          0   
219323                           0                          0   
256066                           0                          0   

       REG_REGION_NOT_LIVE_REGION HOUR_APPR_PROCESS_START  \
47185                           0                       7   
133243                          0                      11   
259367                          0                      18   
219323                          0                      10   
256066                          0                       5   

       WEEKDAY_APPR_PROCESS_START REGION_RATING_CLIENT_W_CITY  \
47185                      FRIDAY                           2   
133243                     MONDAY                           2   
259367                  WEDNESDAY                           2   
219323                   THURSDAY                           2   
256066                   SATURDAY                           2   

       REGION_RATING_CLIENT FLAG_EMAIL FLAG_CONT_MOBILE  \
47185                     2          0                1   
133243                    2          0                1   
259367                    2          0                1   
219323                    2          1                1   
256066                    2          0                1   

             ORGANIZATION_TYPE FLAG_WORK_PHONE FLAG_EMP_PHONE FLAG_MOBIL  \
47185   Business Entity Type 3               0              1          1   
133243           Self-employed               0              1          1   
259367  Business Entity Type 3               0              1          1   
219323                Medicine               0              1          1   
256066                Military               0              1          1   

        NAME_HOUSING_TYPE    NAME_FAMILY_STATUS  \
47185   House / apartment               Married   
133243  House / apartment  Single / not married   
259367  House / apartment               Married   
219323   Office apartment  Single / not married   
256066   Office apartment               Married   

                  NAME_EDUCATION_TYPE NAME_INCOME_TYPE  
47185   Secondary / secondary special          Working  
133243  Secondary / secondary special          Working  
259367  Secondary / secondary special          Working  
219323  Secondary / secondary special          Working  
256066  Secondary / secondary special    State servant  
Primeras filas del conjunto de prueba:
       FONDKAPREMONT_MODE WALLSMATERIAL_MODE  HOUSETYPE_MODE  \
98871           SIN VALOR       Stone, brick  block of flats   
133710          SIN VALOR              Panel  block of flats   
165480          SIN VALOR          SIN VALOR  block of flats   
33194           SIN VALOR          SIN VALOR       SIN VALOR   
27344           SIN VALOR              Panel  block of flats   

       EMERGENCYSTATE_MODE        OCCUPATION_TYPE NAME_TYPE_SUITE  \
98871                   No              SIN VALOR          Family   
133710                  No  Private service staff          Family   
165480                  No               Laborers   Unaccompanied   
33194            SIN VALOR              SIN VALOR   Unaccompanied   
27344                   No               Managers   Unaccompanied   

       CNT_CHILDREN FLAG_DOCUMENT_8 NAME_CONTRACT_TYPE CODE_GENDER  \
98871             0               0         Cash loans           F   
133710            0               1         Cash loans           F   
165480            0               0         Cash loans           M   
33194             0               0         Cash loans           F   
27344             0               0         Cash loans           M   

       FLAG_OWN_CAR FLAG_DOCUMENT_2 FLAG_DOCUMENT_3 FLAG_DOCUMENT_4  \
98871             N               0               0               0   
133710            Y               0               0               0   
165480            N               0               1               0   
33194             N               0               1               0   
27344             N               0               1               0   

       FLAG_DOCUMENT_5 FLAG_DOCUMENT_6 FLAG_DOCUMENT_7 FLAG_DOCUMENT_9  \
98871                0               0               0               0   
133710               0               0               0               0   
165480               0               0               0               0   
33194                0               0               0               0   
27344                0               0               0               0   

       FLAG_DOCUMENT_21 FLAG_DOCUMENT_10 FLAG_DOCUMENT_11 FLAG_OWN_REALTY  \
98871                 0                0                0               Y   
133710                0                0                0               N   
165480                0                0                0               N   
33194                 0                0                0               Y   
27344                 0                0                0               Y   

       FLAG_DOCUMENT_13 FLAG_DOCUMENT_14 FLAG_DOCUMENT_15 FLAG_DOCUMENT_16  \
98871                 0                0                0                0   
133710                0                0                0                0   
165480                0                0                0                0   
33194                 0                0                0                0   
27344                 0                0                0                0   

       FLAG_DOCUMENT_17 FLAG_DOCUMENT_18 FLAG_DOCUMENT_19 FLAG_DOCUMENT_20  \
98871                 0                0                0                0   
133710                0                0                0                0   
165480                0                0                0                0   
33194                 0                0                0                0   
27344                 0                0                0                0   

       FLAG_DOCUMENT_12 FLAG_PHONE LIVE_CITY_NOT_WORK_CITY  \
98871                 0          0                       1   
133710                0          0                       0   
165480                0          0                       0   
33194                 0          0                       0   
27344                 0          1                       0   

       REG_CITY_NOT_WORK_CITY TARGET REG_CITY_NOT_LIVE_CITY  \
98871                       1      0                      0   
133710                      0      0                      0   
165480                      1      0                      1   
33194                       0      0                      0   
27344                       0      0                      0   

       LIVE_REGION_NOT_WORK_REGION REG_REGION_NOT_WORK_REGION  \
98871                            0                          0   
133710                           0                          0   
165480                           0                          0   
33194                            0                          0   
27344                            0                          0   

       REG_REGION_NOT_LIVE_REGION HOUR_APPR_PROCESS_START  \
98871                           0                      13   
133710                          0                      10   
165480                          0                       9   
33194                           0                      10   
27344                           0                       9   

       WEEKDAY_APPR_PROCESS_START REGION_RATING_CLIENT_W_CITY  \
98871                   WEDNESDAY                           2   
133710                     FRIDAY                           2   
165480                    TUESDAY                           2   
33194                     TUESDAY                           2   
27344                      MONDAY                           2   

       REGION_RATING_CLIENT FLAG_EMAIL FLAG_CONT_MOBILE  \
98871                     2          0                1   
133710                    2          0                1   
165480                    2          0                1   
33194                     2          0                1   
27344                     2          0                1   

             ORGANIZATION_TYPE FLAG_WORK_PHONE FLAG_EMP_PHONE FLAG_MOBIL  \
98871                    Other               0              1          1   
133710           Self-employed               0              1          1   
165480  Business Entity Type 3               0              1          1   
33194                      XNA               0              0          1   
27344               Government               1              1          1   

        NAME_HOUSING_TYPE NAME_FAMILY_STATUS            NAME_EDUCATION_TYPE  \
98871   House / apartment            Married  Secondary / secondary special   
133710  House / apartment            Married  Secondary / secondary special   
165480   Rented apartment     Civil marriage  Secondary / secondary special   
33194   House / apartment            Married  Secondary / secondary special   
27344   House / apartment            Married               Higher education   

            NAME_INCOME_TYPE  
98871                Working  
133710               Working  
165480  Commercial associate  
33194              Pensioner  
27344                Working  

Guardado de la tabla¶

In [88]:
df_application_input_train.to_csv("./data_preprocessing/train_pd_data_preprocessing_missing_outlier.csv", index=False)
df_application_input_train.to_csv("./data_preprocessing/test_pd_data_preprocessing_missing_outlier.csv", index=False)

# Verificar los resultados de la operación
print("Archivos CSV creados y guardados con éxito.")
Archivos CSV creados y guardados con éxito.
In [89]:
print(df_application_input_train.shape, df_application_input_test.shape)
(246008, 122) (61503, 122)

Por último, en esta sección se guardaron los DataFrames preprocesados en archivos CSV, indicando que el tratamiento de datos, análisis de correlaciones, manejo de valores missing y outliers se realizó con éxito. Este paso es crucial, ya que asegura que los datos están listos para futuras fases de modelado, manteniendo la calidad y la integridad de la información.